android - una - configuración de archivo de audio como tono de llamada
tono llamada entrante (3)
He guardado el archivo en la carpeta sdcard/media/audio/ringtone
s. Ese archivo aparecerá en la lista de selección de tonos de timbre de la settings/sound/phone
timbre del settings/sound/phone
.
Pero quiero establecer ese archivo como 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
estoy recibiendo 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 newUri
apropiado?
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 lo permitirá. Debe cambiar el nombre de su archivo y agregar otra instancia, o ingresar, eliminar la entrada y volver a intentarlo. Así que quité esa entrada cada vez y luego la inserto de nuevo.
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 insertado anteriormente, 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 va a resolver su problema.