2010-04-27 12 views
56

Tworzę powiadomienia w mojej aplikacji na Androida i chciałbym mieć opcję w moich preferencjach, aby ustawić dźwięk używany do powiadomienia. Wiem, że w aplikacji Ustawienia możesz wybrać domyślny dźwięk powiadomienia z listy. Skąd się bierze ta lista i czy istnieje sposób, aby wyświetlić tę samą listę w mojej aplikacji?Jak wyświetlić listę dostępnych dźwięków powiadomień na Androidzie

Odpowiedz

92

Wystarczy skopiować/wkleić kod z jednej z moich aplikacji, która robi to, czego szukasz.

Jest w obsługi onClick przycisku oznaczonego „ustawić dzwonek” 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 przechwytuje wyboru dokonanego 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; 
      } 
     }    
    } 

Również ja doradzaj moim użytkownikom, aby zainstalowali aplikację "Rings Extended" z Android Market. Wtedy, gdy to okno dialogowe zostanie otwarte na ich urządzeniu, np. Z mojej aplikacji lub z menu ustawień telefonu, użytkownik będzie miał dodatkową możliwość wyboru dowolnego z plików mp3 zapisanych na ich urządzeniu, a nie tylko wbudowanych dzwonków.

+0

Dziękuję you.I jestem w stanie wyświetlić dzwonek z powodzeniem przy użyciu kodu Ale ** onActivityResult() błędu ** metoda Dostaję " Nie można utworzyć statycznego odwołania do niestatycznej metody getParcelableExtra (String) z wpisz Intent "at your line" Uri uri = Intent.getParcelableExtra (RingtoneManager.EXTRA_RINGTONE_PICKED_URI); " – Dharmendra

+1

Ten wiersz powinien brzmieć "Uri uri = intent.getParcelableExtra ...". Zwróć uwagę na "i" w "intencji". Tylko literówka na powyższym kodzie. – zeh

+0

Pomocny kod i umysł mała litera w intent.getParcelableExtra ... Wielkie dzięki – djk

46

Albo po prostu trzymać to w XML preferencje:

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

Pełna treść mojego próbki XML tylko do 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> 
+0

Ta wygląda lepiej .. – Mohsen

13

Jest to metoda używam, aby uzyskać listę dźwięków powiadomień dostępne 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; 
} 

EDYCJA: Jest to komentarz dotyczący ustawiania dźwięk w NotificationCompat.Builder. Ta metoda pobiera identyfikator dzwonka, którego używa telefon, zamiast czytelnego pliku TITLE, do którego trafiła inna metoda. Połącz identyfikator URI i identyfikator, 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 jak "content: // nośnik/wewnętrzny/audio/media/27" .. można następnie przekazać jeden z tych ciągów jako Uri Into the. setSound() jak:

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

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

+0

To miło, ale jak ustawić dźwięk, który będzie odtwarzany za pomocą NotificationCompat.Builder.setSound (uri)? Ustawienie jednego z odczytów Uri z RingtoneManager nie działa – infero

+0

Edytowałem post z odpowiedzią @infero, mam nadzieję, że jest jasne i rozwiązuje twój problem! – Murphybro2

+0

dzięki za aktualizację. Próbowałem ustawić dźwięk w ten sposób z wcześniejszym identyfikatorem, ale użyłem identyfikatora, który nie istniał - :-(grrrr. Jeszcze raz dziękuję – infero

Powiązane problemy