2009-12-31 11 views
12

Eventuali duplicati:
How to set ringtone in Android from my activity?Impostazione Ringtone nei Android

ho suona file nella mia cartella res/raw e voglio selezionare un suono per impostare come suoneria sul click di un pulsante. Mi chiedo come posso farlo?

+0

hai mai trovato una soluzione? – vondip

+1

Questo non è un duplicato! questo parla di impostare una suoneria da un file raw. L'altro è solo come impostare una suoneria già sulla scheda SD. Si prega di riaprire ho una soluzione completa. – ozmike

risposta

-1

io uso "Anelli estesa" http://www.androidapps.com/t/rings-extended

Con questo app installata quando si va a modificare la suoneria si avrà la possibilità di selezionare Anelli estese. Utilizza anche "Ringdroid" per modificare le suonerie.

+0

Desidero un esempio di codice sorgente per incorporare questa funzione nella mia app. –

+0

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

5

Prova questa, per me funziona:

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

Speriamo che da ora avete ottenuto il vostro programma di lavoro il modo in cui si voleva. Solo per la cronaca, però, dovresti cercare di salvare il file nella sdcard sotto una cartella delle suonerie. Assicurati che sia inferiore in quanto è importante in Android.

27

@Maxood

Il codice da @Clive è ciò che è necessario impostare la suoneria. Avrai bisogno del percorso assoluto del file, che non puoi ottenere da una risorsa non elaborata.

La soluzione è ottenere l'asset del file di risorse e scriverlo sulla sdcard 1st, prima di consegnarlo al content resolver per l'inserimento.

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

quindi è possibile utilizzare la soluzione precedentemente pubblicato

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

Non dimenticare di scrivere il permesso

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

nel vostro manifesto

Spero che questo aiuti

+5

Non tentare di battere un cavallo morto qui, ma assicurati di avere l'autorizzazione nel tuo manifest se stai scrivendo sulla scheda SD, altrimenti otterrai un errore. – dell116

+2

Nota anche: Assicurati di impostare l'uri in questo modo: Uri uri = Uri.parse ("android.resource: //com.example.myapp/" + R.raw.my_resource); oppure 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

È necessario creare una directory raw nel progetto sotto la directory res ovvia forse ma non per me, my_resource è il nome del file meno il .extension – ozmike

Problemi correlati