2009-08-13 16 views

Respuesta

64

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.

+0

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'. –

+1

¿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 ... –

+0

Usé 'getApplicationContext()' en lugar de 'main' ¿es correcto o qué más puedo usar para resolver este problema? –

3

Puede utilizar la función incorporada RingtonePreference class. AndroidGuys tiene un buen tutorial en este here.

+0

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

+1

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

0

Encontré este código de la aplicación Media de Android.

Settings.System.putString(resolver, 
Settings.System.RINGTONE, ringUri.toString()); 

esto funciona de mi.

2
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()); 
    } 

} 
+0

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 –

+0

soundFile = mCr.openAssetFileDescriptor (mUri, "r"); puede decirme por qué ha escrito esta línea. –

+0

¿Qué es globalapps aquí? – AndroidHacker

0

¡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!

0

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); 
      } 
     } 
    ); 
0

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) { 


        } 
Cuestiones relacionadas