establecer el archivo de audio como Tono de llamada

Tengo un archivo guardado en la carpeta sdcard/media/audio/ringtone s. Ese archivo aparecerá en la lista de selección de tono de llamada de la settings/sound/phone 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í estoy obteniendo newUri = null 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 puedo obtener el newUri ?

El audio se configura como tono de llamada solo una vez, pero la solución a este problema es: si intenta ejecutar el mismo código nuevamente, estará insertando una entrada duplicada en la tabla de MediaStore, pero la base de datos SQLite no lo permitirá. 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); 

En lugar de eliminar el uri previamente insertado, puede reutilizarlo:

  // 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); 
 RingtoneManager.setActualDefaultRingtoneUri( Context, RingtoneManager.TYPE_RINGTONE, Uri .parse("Media file uri")); 

Creo que esto resolverá tu problema.