2011-08-22 16 views
8

He visto muchos ejemplos de cómo configurar un tono de llamada predeterminado, pero lo que más me interesa es poder completar una lista desplegable llena de los tonos disponibles en el teléfono. Entonces, la lista que las personas ven cuando cambian su tono de llamada en la configuración de Android, quiero poder enumerar todas esas.Obtener una lista de tonos disponibles en Android

Lo más parecido que he encontrado es here, pero nuevamente esto es solo para configurar el tono de llamada predeterminado. ¿Alguna idea a alguien? Puede estar dentro o fuera de ringtonemanager.

Respuesta

14

RingtoneManager es lo que estás buscando. Solo necesita usar setType para establecer TYPE_RINGTONE y luego iterar sobre el Cursor provisto por getCursor.

Este es un ejemplo de trabajo de un método hipotético que devuelve una matriz de URIs, con la única diferencia leve que está buscando alarmas en lugar de tonos de llamada:

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

tengo un 'StaleDataException' (* Intento de acceder a un cursor después de que se ha cerrado. *) Al poner el teléfono a dormir y despertar de nuevo después de usar este código. No cerrar el cursor parece arreglarlo, supongo que "RingtoneManager" devuelve un cursor administrado. – eWolf

+1

@eWolf El 'getCursor' [docs] (https://developer.android.com/reference/android/media/RingtoneManager.html#getCursor%28%29) estado: ' El cursor devuelto será el mismo cursor devuelto cada vez que se llama a este método, por lo tanto, no cierre() el cursor. El cursor se puede desactivar() de forma segura. Si RingtoneManager (Activity) no se usó, la persona que llama debe administrar el cursor devuelto durante el ciclo de vida de su actividad para evitar que el cursor se pierda. – user650881

+0

@ user650881: lo extraño es que [deactivate] (https://developer.android. com/reference/android/database/Cursor.html # deactivate% 28% 29) está en desuso desde API 16 (Android 4.1 JellyBean). [Mirando el código] (https://github.com/android/platform_frameworks_base/blob/kitkat-release/media/java/android/media/RingtoneManager.java#L360) parece que la mejor solución es crear un nuevo instancia de RingtoneManager para tener un nuevo cursor válido (o para mantener el cursor hasta que realmente se usa). – Diego

12

Esto le devolverá el título y el URI de todos los tonos de llamada disponibles. ¡Haz con ellos lo que desees!

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

Para obtener el tono de llamada correcto uri necesita agregar un valor de cursor.getString (RingtoneManager.ID_COLUMN_INDEX)). Entonces será Uri uri = Uri.parse (notificationUri + "/" + cursor.getString (RingtoneManager.ID_COLUMN_INDEX)). Después de eso, puede obtener un tono de llamada de RingtoneManager.getRingtone (context, uri) y reproducirlo, por ejemplo. – blyabtroi

+0

@blyabtroi Gracias. ¡Salvaste mi día! –

+0

cómo obtener el título/nombre del tono de llamada –

Cuestiones relacionadas