2009-12-31 19 views
12

Duplicar posibles:
How to set ringtone in Android from my activity?Ajuste de tono en Android

tengo suena archivos en mi res/carpeta de crudo y quiero seleccionar un sonido para establecer como tono de llamada en el clic de un botón. Me pregunto cómo puedo hacer eso?

+0

¿Alguna vez ha encontrado una solución? – vondip

+1

¡Esto no es un duplicado! esto habla sobre la configuración de un tono de llamada de un archivo sin formato. El otro es simplemente cómo configurar un tono de llamada que ya está en la tarjeta sd. Por favor reabre, tengo una solución completa. – ozmike

Respuesta

-1

utilizo "Anillos" Extended http://www.androidapps.com/t/rings-extended

Con esa aplicación instalada cuando se va a cambiar su tono de timbre que tendrá la opción de seleccionar anillos de extensión. También use "Ringdroid" para editar tonos de llamada.

+0

Quiero un código fuente de ejemplo para incorporar esta característica en mi aplicación. –

+0

http://code.google.com/p/apps-for-android/source/browse/#svn/trunk/RingsExtended/src/com/example/android/rings_extended – SuperJames

5

probar esto, funciona para mí:

ContentValues values = new ContentValues(); 
values.put(MediaStore.MediaColumns.DATA, <<asbolutePathToYourAudioFileHere>>); 
values.put(MediaStore.MediaColumns.TITLE, "<<yourRingToneNameHere>>"); 
values.put(MediaStore.MediaColumns.SIZE, k); 
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mpeg"); // assuming it's an mpeg, of course 
values.put(MediaStore.Audio.Media.ARTIST, "<<yourArtistNameHere>>"); 
// values.put(MediaStore.Audio.Media.DURATION, duration); // doesn't appear to be necessary if you don't know 
values.put(MediaStore.Audio.Media.IS_RINGTONE, true); 

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

RingtoneManager.setActualDefaultRingtoneUri(
           <<MyActivity>>.this, 
           RingtoneManager.TYPE_RINGTONE, 
           newUri); 
1

Esperemos que por ahora se ha llegado a su programa de trabajo de la manera que quería. Sin embargo, solo para el registro, debería buscar guardar el archivo en la tarjeta SD bajo una carpeta de tonos de llamada. Asegúrate de que tenga una carcasa más baja, ya que eso sí importa en Android.

27

@Maxood

El código de @Clive es lo que necesita para establecer el tono de llamada. Necesitará la ruta absoluta al archivo, que no puede obtener de un recurso sin procesar.

La solución es obtener el activo del archivo de recursos y escribirlo en la sdcard primero, antes de entregarlo al solucionador de contenido para su inserción.

File newSoundFile = new File("/sdcard/media/ringtone", "myringtone.oog"); 
Uri mUri = Uri.parse("android.resource://com.your.package/R.raw.your_resource_id"); 
ContentResolver mCr = app.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) { 
    } 

continuación, puede utilizar la solución previamente publicado

 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/oog"); 
    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 { 
     RingtoneManager.setActualDefaultRingtoneUri(getContext(), RingtoneManager.TYPE_RINGTONE, newUri); 
    } catch (Throwable t) { 
     Log.d(TAG, "catch exception"); 
    } 

No se olvide de escribir el permiso

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

en su manifiesto

espero que esto ayude

+5

No estoy tratando de vencer a un caballo muerto aquí, pero asegúrese de tener el permiso en su manifiesto si está escribiendo en la tarjeta SD o de lo contrario recibirá un error. – dell116

+2

También para tener en cuenta: asegúrese de configurar el uri como tal - Uri uri = Uri.parse ("android.resource: //com.example.myapp/" + R.raw.my_resource); o Uri uri = Uri.parse ("android.resource: //com.example.myapp/raw/my_resource"); http://developer.android.com/reference/android/content/ContentResolver.html#openAssetFileDescriptor%28android.net.Uri,%20java.lang.String%29 – worked

+0

Debe crear un directorio sin formato en su proyecto bajo el directorio res obvio tal vez pero no para mí, my_resource es el nombre del archivo menos la .extension – ozmike

Cuestiones relacionadas