Jak wyświetlić listę dostępnych dźwięków powiadomień na Androidzie

Tworzę powiadomienia w mojej aplikacji na Androida i chciałbym mieć opcję w moich preferencjach, aby ustawić, jaki dźwięk jest używany do powiadomienia. Wiem, że w aplikacji Ustawienia można wybrać domyślny dźwięk powiadomienia z listy. Skąd pochodzi ta lista i czy istnieje sposób na wyświetlenie tej samej listy w mojej aplikacji?

Author: robintw, 2010-04-28

3 answers

Po prostu skopiuj / wklej kod z jednej z moich aplikacji, który robi to, czego szukasz.

To jest w onclick obsługi przycisku oznaczonego "set ringtone" lub coś podobnego:
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);

I ten kod oddaje wybór dokonany przez użytkownika:

 @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;
          }
      }            
  }
Ponadto radzę moim użytkownikom zainstalować aplikację "Rings Extended" z Android Market. Następnie za każdym razem, gdy to okno dialogowe zostanie otwarte na swoim urządzeniu, na przykład z mojej aplikacji lub z menu ustawień telefonu, użytkownik będzie miał dodatkowy wybór wyboru dowolnego z MP3 przechowywanych na urządzeniu, a nie tylko wbudowanych dzwonków.
 97
Author: Mark B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-06 15:15:50

Lub po prostu wsadź to w swoje preferencje XML:

  <RingtonePreference android:showDefault="true"
     android:key="Audio" android:title="Alarm Noise"
     android:ringtoneType="notification" />

Pełna treść mojego przykładowego XML tylko dla kontekstu:

<?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>
 48
Author: JD.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-01 08:49:50

Jest to metoda, której używam, aby uzyskać listę dźwięków powiadomień dostępnych w telefonie:)

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: chodzi o komentarz dotyczący ustawienia dźwięku w NotificationCompat.Budowniczy. Ta metoda pobiera identyfikator dzwonka, który jest tym, czego używa telefon, zamiast czytelnego dla człowieka tytułu, który otrzymała inna metoda. Połącz uri i id, a otrzymasz lokalizację dzwonków.

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

Powyższy kod zwróci listę ciągów takich jak "content://media/internal/audio/media/27".. następnie można przekazać jeden z tych ciągów jako Uri do .setSound () like:

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

Mam nadzieję, że to było wystarczająco jasne:)

 15
Author: Murphybro2,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-05 08:18:46