Как вывести список доступных мелодий уведомлений на Android
Я создаю уведомления в своем приложении для Android и хотел бы иметь опцию в своих настройках, чтобы установить, какой звук используется для уведомления. Я знаю, что в настройках приложения можно выбрать звук уведомления по умолчанию из списка. Откуда этот список взялся, и есть ли способ для меня, чтобы отобразить тот же список в моем приложении?
3 ответов:
просто скопируйте / вставьте код из одного из моих приложений, который делает то, что вы ищете.
это в обработчике onClick кнопки с надписью "установить рингтон" или что-то подобное:
Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_NOTIFICATION); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, "Select Tone"); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, (Uri) null); this.startActivityForResult(intent, 5);и этот код фиксирует выбор, сделанный пользователем:
@Override protected void onActivityResult(final int requestCode, final int resultCode, final Intent intent) { if (resultCode == Activity.RESULT_OK && requestCode == 5) { Uri uri = intent.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI); if (uri != null) { this.chosenRingtone = uri.toString(); } else { this.chosenRingtone = null; } } }кроме того, я советую своим пользователям установить приложение "Rings Extended" из Android Market. Затем всякий раз, когда этот диалог открывается на их устройстве, например, из моего приложения или из меню настроек телефона, у пользователя будет дополнительный выбор выбора любого из mp3-файлов, хранящихся на их устройстве, а не только встроенных рингтонов.
или просто вставьте это в свои предпочтения XML:
<RingtonePreference android:showDefault="true" android:key="Audio" android:title="Alarm Noise" android:ringtoneType="notification" />полное содержание моего образца XML только для контекста:
<?xml version="1.0" encoding="UTF-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <EditTextPreference android:title="Some value" android:key="someval" android:summary="Please provide some value" /> <EditTextPreference android:title="Some other value" android:key="someval2" android:summary="Please provide some other value" /> <RingtonePreference android:showDefault="true" android:key="Audio" android:title="Alarm Noise" android:ringtoneType="notification" /> </PreferenceScreen>
Это метод, который я использую, чтобы получить список звуков уведомлений, доступных в телефоне :)
public Map<String, String> getNotifications() { RingtoneManager manager = new RingtoneManager(this); manager.setType(RingtoneManager.TYPE_NOTIFICATION); Cursor cursor = manager.getCursor(); Map<String, String> list = new HashMap<>(); while (cursor.moveToNext()) { String notificationTitle = cursor.getString(RingtoneManager.TITLE_COLUMN_INDEX); String notificationUri = cursor.getString(RingtoneManager.URI_COLUMN_INDEX); list.put(notificationTitle, notificationUri); } return list; }EDIT: это для комментария о том, как установить звук в NotificationCompat.Строитель. Этот метод вместо этого получает идентификатор мелодии звонка, который использует телефон, а не читаемый человеком заголовок, который получил другой метод. Объедините uri и id, и у вас есть местоположение рингтонов.
public ArrayList<String> getNotificationSounds() { RingtoneManager manager = new RingtoneManager(this); manager.setType(RingtoneManager.TYPE_NOTIFICATION); Cursor cursor = manager.getCursor(); ArrayList<String> list = new ArrayList<>(); while (cursor.moveToNext()) { String id = cursor.getString(RingtoneManager.ID_COLUMN_INDEX); String uri = cursor.getString(RingtoneManager.URI_COLUMN_INDEX); list.add(uri + "/" + id); } return list; }приведенный выше код вернет список строк, таких как "content: / / media / internal / audio / media / 27".. затем вы можете передать одну из этих строк в качестве Uri.setSound () like:
.setSound(Uri.parse("content://media/internal/audio/media/27"))надеюсь, что это было достаточно ясно :)
Comments