2011-08-22 10 views
8

Widziałem wiele przykładów, jak ustawić domyślny dzwonek, ale bardziej mnie interesuje możliwość wypełnienia listy rozwijanej zawierającej dostępne dzwonki telefon. Lista, którą ludzie widzą, gdy zmieniają swój dzwonek w ustawieniach Androida, chcę móc wymienić wszystkie te.Uzyskiwanie listy dostępnych dzwonków w Androidzie

Najbliższą rzeczą, którą znalazłem jest here, ale znowu jest to tylko ustawienie domyślnego dzwonka. Jakieś pomysły dla kogokolwiek? Może być w lub z dzwonka.

Odpowiedz

14

RingtoneManager jest tym, czego szukasz. Wystarczy użyć setType, aby ustawić TYPE_RINGTONE, a następnie powtórzyć kursor nad kursorem dostarczonym przez getCursor.

Jest to przykład roboczych o hipotetycznej metody, która zwraca tablicę URI, z tą tylko różnicą, że to szuka alarmów zamiast dzwonków:

RingtoneManager ringtoneMgr = new RingtoneManager(this); 
ringtoneMgr.setType(RingtoneManager.TYPE_ALARM); 
Cursor alarmsCursor = ringtoneMgr.getCursor(); 
int alarmsCount = alarmsCursor.getCount(); 
if (alarmsCount == 0 && !alarmsCursor.moveToFirst()) { 
    return null; 
} 
Uri[] alarms = new Uri[alarmsCount]; 
while(!alarmsCursor.isAfterLast() && alarmsCursor.moveToNext()) { 
    int currentPosition = alarmsCursor.getPosition(); 
    alarms[currentPosition] = ringtoneMgr.getRingtoneUri(currentPosition); 
} 
alarmsCursor.close(); 
return alarms; 
+0

Dostałem 'StaleDataException' (* Próba uzyskania dostępu do kursora po to został zamknięty. *) Gdy wprowadzenie telefonu w tryb uśpienia i budzi go ponownie po użyciu tego kodu. Brak zamykania kursora wydaje się go naprawić - przypuszczam, że 'RingtoneManager' zwraca zarządzany kursor? – eWolf

+1

@eWolf Metoda getCursor' [docs (https://developer.android.com/reference/android/media/RingtoneManager.html#getCursor%28%29): 'Zwrócony kursor będzie tym samym kursorem zwracana za każdym razem, gdy wywoływana jest ta metoda, więc nie zamykaj() kursora. Kursor można bezpiecznie dezaktywować(). Jeśli RingtoneManager (Activity) nie był używany, osoba dzwoniąca powinna zarządzać zwróconym kursorem podczas jego cyklu życia, aby zapobiec przeciekowi kursora. " – user650881

+0

@ user650881: Dziwne jest to, że [dezaktywuj] (https://developer.android. com/reference/android/database/Cursor.html # deactivate% 28% 29) jest przestarzałe od API 16 (Android 4.1 JellyBean). [Patrząc na kod] (https://github.com/android/platform_frameworks_base/blob/kitkat-release/media/java/android/media/RingtoneManager.java#L360) wydaje się, że najlepszym rozwiązaniem jest stworzenie nowego instancja RingtoneManager, aby mieć nowy poprawny kursor (lub aby utrzymywać kursor do momentu rzeczywistego użycia). – Diego

12

To spowoduje powrót tytuł i URI wszystkie dostępne dzwonki. Rób z nimi, co chcesz!

public Map<String, String> getNotifications() { 
    RingtoneManager manager = new RingtoneManager(this); 
    manager.setType(RingtoneManager.TYPE_RINGTONE); 
    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; 
} 
+4

Aby uzyskać poprawny dźwięk dzwonka musisz dodać wartość cursor.getString (RingtoneManager.ID_COLUMN_INDEX)). Będzie to Uri uri = Uri.parse (notificationUri + "/" + cursor.getString (RingtoneManager.ID_COLUMN_INDEX)). Następnie możesz uzyskać dzwonek RingtoneManager.getRingtone (context, uri) i na przykład go odtworzyć. – blyabtroi

+0

@blyabtroi Dziękuję. Uratowałeś mój dzień! –

+0

jak uzyskać tytuł/nazwę dzwonka –

Powiązane problemy