Estoy tratando de encontrar una forma de establecer un nuevo tono de llamada predeterminado por código de mi actividad de Android.¿Cómo establecer el tono de llamada en Android de mi actividad?
Ya he descargado el tono de llamada en un bytearray
.
Estoy tratando de encontrar una forma de establecer un nuevo tono de llamada predeterminado por código de mi actividad de Android.¿Cómo establecer el tono de llamada en Android de mi actividad?
Ya he descargado el tono de llamada en un bytearray
.
Finalmente, logré establecer el tono de llamada predeterminado a uno que descargué. El código de descarga no se incluye a continuación, solo lo que se necesita para configurarlo como tono de llamada predeterminado.
File k = new File(path, "mysong.mp3"); // path is a file to /sdcard/media/ringtone
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath());
values.put(MediaStore.MediaColumns.TITLE, "My Song title");
values.put(MediaStore.MediaColumns.SIZE, 215454);
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3");
values.put(MediaStore.Audio.Media.ARTIST, "Madonna");
values.put(MediaStore.Audio.Media.DURATION, 230);
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);
//Insert it into the database
Uri uri = MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath());
Uri newUri = this.getContentResolver().insert(uri, values);
RingtoneManager.setActualDefaultRingtoneUri(
myActivity,
RingtoneManager.TYPE_RINGTONE,
newUri
);
De todos modos, no entiendo totalmente lo que hace este código.
El administrador de tono necesita un uri para el archivo que se establecerá como un nuevo tono de llamada. Pero este uri no puede ser directamente a la tarjeta SD como "/sdcard/media/ringtones/mysong.mp3". ¡Eso no funciona!
Lo que se necesita es el URI archivo externo del archivo que podría ser algo así como "/ externa/audio/media/46"
El 46 es el identificador de la columna en la base de datos MediaStore, así que eso ¿Por qué necesita agregar el archivo sdcard en la base de datos primero?
De todos modos, ¿cómo mantiene mediastore sus ids? Este número puede ser muy alto, ya que realiza esta operación muchas veces.
¿Debo eliminar esta fila? El problema es que algunas veces ni siquiera controlo la eliminación del archivo, ya que se puede eliminar directamente de la tarjeta sd con un navegador de archivos.
Puede utilizar la función incorporada RingtonePreference class. AndroidGuys tiene un buen tutorial en este here.
Uh, gracias por el reconocimiento, pero RingtonePreference le permite al usuario elegir un recurso de tono de llamada para que use * su * aplicación. No configura el tono de llamada del sistema. – CommonsWare
Ok, puede que me haya perdido, pero la referencia no dice explícitamente eso.Me pregunto qué haría alguien con un tono de llamada en su aplicación a menos que la aplicación maneje las llamadas entrantes. – russoue
Encontré este código de la aplicación Media de Android.
Settings.System.putString(resolver,
Settings.System.RINGTONE, ringUri.toString());
esto funciona de mi.
public void setRingtone() {
String ringtoneuri = Environment.getExternalStorageDirectory().getAbsolutePath() + "/media/ringtone";
File file1 = new File(ringtoneuri);
file1.mkdirs();
File newSoundFile = new File(ringtoneuri, "myringtone.mp3");
Uri mUri = Uri.parse("android.resource://globalapps.funnyringtones/raw/sound_two.mp3");
ContentResolver mCr = this.getContentResolver();
AssetFileDescriptor soundFile;
try {
soundFile = mCr.openAssetFileDescriptor(mUri, "r");
} catch (FileNotFoundException e) {
soundFile = null;
}
try {
byte[] readData = new byte[1024];
FileInputStream fis = soundFile.createInputStream();
FileOutputStream fos = new FileOutputStream(newSoundFile);
int i = fis.read(readData);
while (i != -1) {
fos.write(readData, 0, i);
i = fis.read(readData);
}
fos.close();
} catch (IOException io) {
}
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DATA, newSoundFile.getAbsolutePath());
values.put(MediaStore.MediaColumns.TITLE, "my ringtone");
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3");
values.put(MediaStore.MediaColumns.SIZE, newSoundFile.length());
values.put(MediaStore.Audio.Media.ARTIST, R.string.app_name);
values.put(MediaStore.Audio.Media.IS_RINGTONE, true);
values.put(MediaStore.Audio.Media.IS_NOTIFICATION, true);
values.put(MediaStore.Audio.Media.IS_ALARM, true);
values.put(MediaStore.Audio.Media.IS_MUSIC, false);
Uri uri = MediaStore.Audio.Media.getContentUriForPath(newSoundFile.getAbsolutePath());
Uri newUri = mCr.insert(uri, values);
try {
Uri rUri = RingtoneManager.getValidRingtoneUri(this);
if (rUri != null)
ringtoneManager.setStopPreviousRingtone(true);
RingtoneManager.setActualDefaultRingtoneUri(getApplicationContext(), RingtoneManager.TYPE_RINGTONE, newUri);
Toast.makeText(this, "New Rigntone set", Toast.LENGTH_SHORT).show();
} catch (Throwable t) {
Log.e("sanjay in catch", "catch exception"+e.getMessage());
}
}
Esto te ayudará a configurar el tono de llamada de la carpeta sin formato donde has puesto todos tus tonos de llamada. Está funcionando bien para yo también –
soundFile = mCr.openAssetFileDescriptor (mUri, "r"); puede decirme por qué ha escrito esta línea. –
¿Qué es globalapps aquí? – AndroidHacker
¡Este es el código que he usado! Espero que ayude ..
Esta es también la link.
String exStoragePath = Environment.getExternalStorageDirectory().getAbsolutePath();
String path=(exStoragePath +"/media/alarms/");
saveas(RingtoneManager.TYPE_RINGTONE);
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+path+filename+".mp3"
+ Environment.getExternalStorageDirectory())));
File k = new File(path, filename);
ContentValues values = new ContentValues(4);
long current = System.currentTimeMillis();
values.put(MediaStore.MediaColumns.DATA, path + filename );
values.put(MediaStore.MediaColumns.TITLE, filename);
values.put(MediaStore.Audio.Media.DATE_ADDED, (int) (current/1000));
values.put(MediaStore.Audio.Media.MIME_TYPE, "audio/3gpp");
//new
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, true);
values.put(MediaStore.Audio.Media.IS_MUSIC, false);
// Insert it into the database
this.getContentResolver()
.insert(MediaStore.Audio.Media.getContentUriForPath(k
.getAbsolutePath()), values);
HAPPY CODING!
No puedo comentar la solución porque no tengo suficiente reputación en desbordamiento de pila ... Solo quiero agregar una forma de agregar el archivo de audio a la base de datos sin tener que acceder directamente a la base de datos y evitar duplicados. La solución se basa en MediaScannerConnection, este es el código que utilicé:
String[] files = { audioFullPath };
MediaScannerConnection.scanFile(
getApplicationContext(),
files,
null,
new OnScanCompletedListener() {
@Override
public void onScanCompleted(String path, Uri uri) {
Log.v("myapp", "file " + path + " was scanned seccessfully: " + uri);
}
}
);
respuesta por Vidar es demasiado largo y se agrega entradas duplicadas cada vez que se desea establecer una canción como tono de llamada. En su lugar, debe probar esto
Uri newUri=Uri.parse("content://media/external/audio/media/"+ID);
try {
RingtoneManager.setActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE, newUri);
}
catch (Throwable t) {
}
La interacción con el proveedor de contenidos multimedia en el código anterior crea una nueva entrada cada vez. Es posible que desee realizar un seguimiento de los URI que está generando, por lo que puede evitar volver a descargar, y salte directamente a 'RingtoneManager'. –
¿Qué es 'main' en esta línea' Uri newUri = main.getContentResolver(). Insert (uri, values); 'Estoy obteniendo el nuevo Uri como nulo por qué no. Por favor, ayúdenme ... –
Usé 'getApplicationContext()' en lugar de 'main' ¿es correcto o qué más puedo usar para resolver este problema? –