2011-01-05 27 views
16

Tengo guardar el archivo en la carpeta sdcard/media/audio/ringtone s. Ese archivo aparecerá en la lista de selección de tonos de llamada desde settings/sound/phone Tono de llamada.configuración de archivo de audio como tono de llamada

Pero quiero establecer ese archivo como un tono de llamada de mi código. Aquí está mi código.

File k = new File(path, filename); 

    ContentValues values = new ContentValues(); 
    values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath()); 
    values.put(MediaStore.MediaColumns.TITLE, "TwiAppclip"); 
    values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/*"); 
    values.put(MediaStore.Audio.Media.ARTIST, "cssounds "); 
    values.put(MediaStore.Audio.Media.IS_RINGTONE, true); 
    values.put(MediaStore.Audio.Media.IS_NOTIFICATION, false); 
    values.put(MediaStore.Audio.Media.IS_ALARM, false); 
    values.put(MediaStore.Audio.Media.IS_MUSIC, false); 

    Uri uri = MediaStore.Audio.Media.getContentUriForPath(k 
     .getAbsolutePath()); 
    Uri newUri = getApplicationContext().getContentResolver().insert(uri, values); 

    RingtoneManager.setActualDefaultRingtoneUri(getApplicationContext(), 
     RingtoneManager.TYPE_RINGTONE, newUri); 

aquí uri Me estoy haciendo Pero tengo newUri = null. Creo que es por eso que no está configurando como tono de llamada.

¿Alguien sabe dónde está el problema? ¿Cómo obtengo newUri?

+1

si pongo mis tonos de llamada en carpeta de crudo, lo que debería especificar que PATH? :) – Roylee

Respuesta

35

El audio se establece como tono de llamada solo una vez, pero la solución a este problema es: Si intenta ejecutar el mismo código nuevamente, insertará una entrada duplicada en la tabla de MediaStore, pero la base de datos SQLite no permitirá tú. Debe cambiar el nombre de su archivo y agregar otra instancia, o entrar, eliminar la entrada y luego volver a intentarlo. Así que eliminé esa entrada cada vez y luego la inserté nuevamente.

Uri uri = MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath()); 
getContentResolver().delete(uri, MediaStore.MediaColumns.DATA + "=\"" + k.getAbsolutePath() + "\"", null); 
Uri newUri = getContentResolver().insert(uri, values); 

RingtoneManager.setActualDefaultRingtoneUri(activity.this, 
     RingtoneManager.TYPE_RINGTONE, newUri); 
+2

Genius! Gracias, he estado buscando la sintaxis sobre cómo consultar correctamente un duplicado. – Nick

+0

Gracias hombre. Eso fue genial. Estuve buscando esto durante semanas y sabes qué. El bloque catch captura esta excepción, pero la variable de excepción es nula. No tenía idea de que podría ser este problema. Gracias: D – drulabs

+1

-1 por esta respuesta, ya que no funciona! ¡La falta de comprobación para eliminar, por lo que este código que rodea la obtención del Uri y la eliminación es un código perezoso! La respuesta más correcta habría sido obtener el _ID del medio y este int nRowsDeleted = getContentResolver(). Delete (Uri.parse (MediaStore.Audio.Media.EXTERNAL_CONTENT_UR I + "/" + _ID), nulo, nulo); if (nRowsDeleted> 0) {// delete funcionó} else {// delete failed} – t0mm13b

1
RingtoneManager.setActualDefaultRingtoneUri(
Context, 
RingtoneManager.TYPE_RINGTONE, 
Uri 
.parse("Media file uri")); 

Creo que esto resolverá su problema.

+2

No creo que tengas la pregunta. – drulabs

3

En lugar de eliminar las uri insertados previamente, se puede reutilizar:

// check if file already exists in MediaStore 
    String[] projection = {MediaStore.Audio.Media._ID}; 
    String selectionClause = MediaStore.Audio.Media.DATA + " = ? "; 
    String[] selectionArgs = {ringtoneFile.getAbsolutePath()}; 
    Cursor cursor = context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, projection, selectionClause, selectionArgs, null); 
    Uri insertedUri; 
    if (cursor == null || cursor.getCount() < 1) { 
     // not exist, insert into MediaStore 
     ContentValues cv = new ContentValues(); 
     cv.put(MediaStore.Audio.Media.DATA, ringtoneFile.getAbsolutePath()); 
     cv.put(MediaStore.MediaColumns.TITLE, ringtoneFile.getName()); 
     insertedUri = context.getContentResolver().insert(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, cv); 
    } else { 
     // already exist 
     cursor.moveToNext(); 
     long id = cursor.getLong(0); 
     insertedUri = ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id); 
    } 
    RingtoneManager.setActualDefaultRingtoneUri(context, type, insertedUri); 
+0

¿Estaba destinado a "reemplazar" el tono de llamada anterior? –

Cuestiones relacionadas