Как вывести список доступных звуков уведомлений на Android - PullRequest
63 голосов
/ 28 апреля 2010

Я создаю уведомления в своем приложении для Android и хотел бы, чтобы в моих настройках была опция, позволяющая установить, какой звук используется для уведомления. Я знаю, что в приложении «Настройки» вы можете выбрать звук уведомления по умолчанию из списка. Откуда этот список, и есть ли способ показать мне этот список в моем приложении?

Ответы [ 4 ]

101 голосов
/ 28 апреля 2010

Просто скопируйте / вставьте некоторый код из одного из моих приложений, которое делает то, что вы ищете.

Это в обработчике 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-файлов, сохраненных на его устройстве, а не только встроенные мелодии звонка.

49 голосов
/ 13 мая 2011

Или просто вставьте это в свои предпочтения 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>
16 голосов
/ 17 апреля 2015

Это метод, который я использую, чтобы получить список звуков уведомлений, доступных в телефоне :)

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;
}

РЕДАКТИРОВАТЬ: Это для комментария относительно того, как установить звук в NotificationCompat.Builder. Вместо этого этот метод получает идентификатор мелодии звонка, который используется телефоном, вместо удобочитаемого для человека названия, полученного другим методом. Объедините 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 () как:

.setSound(Uri.parse("content://media/internal/audio/media/27"))

Надеюсь, это было достаточно ясно:)

0 голосов
/ 24 мая 2019

Вот еще один подход (в Kotlin), основанный на других ответах на этот вопрос, который позволяет вам указать название тембра и затем воспроизвести его:

fun playErrorTone(activity: Activity, context: Context, notificationName: String = "Betelgeuse") {

        val notifications = getNotificationSounds(activity)

        try {
            val tone = notifications.getValue(notificationName)
            val errorTone = RingtoneManager.getRingtone(context, Uri.parse(tone))
            errorTone.play()
        } catch (e: NoSuchElementException) {
            try {
                // If sound not found, default to first one in list
                val errorTone = RingtoneManager.getRingtone(context, Uri.parse(notifications.values.first()))
                errorTone.play()
            } catch (e: NoSuchElementException) {
                Timber.d("NO NOTIFICATION SOUNDS FOUND")
            }
        }
    }

    private fun getNotificationSounds(activity: Activity): HashMap<String, String> {
        val manager = RingtoneManager(activity)
        manager.setType(RingtoneManager.TYPE_NOTIFICATION)
        val cursor = manager.cursor

        val list = HashMap<String, String>()
        while (cursor.moveToNext()) {
            val id = cursor.getString(RingtoneManager.ID_COLUMN_INDEX)
            val uri = cursor.getString(RingtoneManager.URI_COLUMN_INDEX)
            val title = cursor.getString(RingtoneManager.TITLE_COLUMN_INDEX)

            list.set(title, "$uri/$id")
        }

        return list
    }

Возможно, потребуется рефакторинг и оптимизация, но вы должны понять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...