2010-04-27 20 views
56

auf Ich erstelle Benachrichtigungen in meiner Android-Anwendung und möchte in meinen Einstellungen eine Option festlegen, welche Töne für die Benachrichtigung verwendet werden. Ich weiß, dass Sie in der Anwendung "Einstellungen" einen Standardbenachrichtigungston aus einer Liste auswählen können. Woher kommt diese Liste, und gibt es eine Möglichkeit für mich, dieselbe Liste in meiner Anwendung anzuzeigen?So rufen Sie die Liste der verfügbaren Benachrichtigungstöne auf Android

Antwort

92

Kopieren Sie einfach Code aus einer meiner Apps, der das tut, wonach Sie suchen.

Dies ist in einem onClick-Handler einer Taste "Set Klingelton" oder etwas ähnliches markiert:

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

Und dieser Code fängt die vom Benutzer vorgenommene Auswahl:

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

Auch ich raten Sie meinen Nutzern, die App "Rings Extended" aus dem Android Market zu installieren. Jedes Mal, wenn dieser Dialog auf seinem Gerät geöffnet wird, z. B. über meine App oder über das Einstellungsmenü des Telefons, hat der Benutzer die zusätzliche Wahl, alle auf seinem Gerät gespeicherten MP3s auszuwählen, nicht nur die eingebauten Klingeltöne.

+0

Viele you.I Lage ist Klingelton angezeigt werden erfolgreich Ihren Code aber in ** onActivityResult() ** Methode ich erhalte Fehler " Es kann keine statische Referenz auf die nicht statische Methode getParcellableExtra (String) von der Typ Intent "an deiner Linie" Uri uri = Intent.getParcelableExtra (RingtoneManager.EXTRA_RINGTONE_PICKED_URI); " – Dharmendra

+1

Diese Zeile sollte "Uri uri = intent.getParcelableExtra ..." lesen. Beachte das Lowcase "i" in "intent". Nur ein Tipp auf den obigen Code. – zeh

+0

Hilfreiche Code und beachten Sie den kleinen Buchstaben in intent.getParcelableExtra ... Vielen Dank – djk

46

Oder einfach halten diese XML in Ihre Vorlieben:

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

Vollständiger Inhalt meiner XML-Beispiel nur für Kontext:

<?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

Dieser sieht besser aus .. – Mohsen

13

Dies ist die Methode, die ich verwenden, um eine Liste der Benachrichtigungs Sounds zu bekommen im Telefon verfügbar :)

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: Dies ist für den Kommentar zur Einstellung der Sound im NotificationCompat.Builder. Diese Methode erhält stattdessen die ID des Klingeltons, die das Telefon verwendet, anstelle des menschlich lesbaren TITLE der anderen Methode. Kombinieren Sie die URL und die ID und Sie haben den Standort der Klingeltöne.

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

Der obige Code wird eine Liste von Zeichenketten wie zurückkehren „Inhalt: // media/intern/Audio/media/27“ .. Sie dann eine dieser Zeichenketten als Uri in die passieren können. setSound() wie:

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

Hoffnung, die klar genug war :)

+0

Das ist nett, aber wie stellen Sie den Sound mit NotificationCompat.Builder.setSound (URI)? Einstellung eines der Uri Lesung aus dem RingtoneManager funktioniert nicht – infero

+0

Ich habe den Beitrag mit der Antwort @infero bearbeitet, hoffe, es ist klar und löst Ihr Problem! – Murphybro2

+0

danke für das Update. Ich habe versucht, den Sound auf diese Weise mit der ID vor, aber verwendet eine ID, die nicht existierte - :-(Grrrr. Nochmals vielen Dank – infero

Verwandte Themen