2009-08-13 22 views

risposta

64

Infine, sono riuscito a impostare la suoneria predefinita su una che ho scaricato. Il codice di download non è incluso di seguito, solo ciò che era necessario per impostarlo come suoneria predefinita.

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

In ogni caso, non capisco completamente cosa stia facendo questo codice.

Il gestore della suoneria richiede un uri per il file che deve essere impostato come nuova suoneria. Ma questo uri non può essere direttamente alla sdcard come "/sdcard/media/ringtones/mysong.mp3". Questo non funziona!

Quello che vi serve è l'uri file esterno del file che potrebbe essere qualcosa di simile a "/ esterno/audio/media/46"

Il 46 è l'id della colonna nel database MediaStore, di modo che è perché è necessario prima aggiungere il file sdcard nel database.

In ogni caso, come fa il mediastore a mantenere i propri ID? Questo numero può diventare davvero alto, poiché fai questa operazione molte volte.

Devo cancellare questa riga da solo? Il problema è che alcune volte non controllo nemmeno la cancellazione del file poiché può essere cancellato direttamente dalla sdcard con un filebrowser.

+0

L'interazione con il provider di contenuti multimediali nel codice sopra crea ogni volta una nuova voce. Si consiglia di tenere traccia degli URI che si stanno generando, in modo da evitare il ri-download e saltare direttamente a 'RingtoneManager'. –

+1

cosa è 'main' in questa riga' Uri newUri = main.getContentResolver(). Insert (uri, valori); 'Sto ottenendo nuovo Uri come null perché non lo faccio. Per favore aiutami .. –

+0

Ho usato 'getApplicationContext()' al posto di 'main' è giusto o cos'altro posso usare per risolvere questo problema .. –

3

È possibile utilizzare la classe integrata RingtonePreference. AndroidGuys ha un bel tutorial su questo here.

+0

Uh, grazie per l'urlo, ma RingtonePreference consente all'utente di scegliere una risorsa suoneria per * l'applicazione * da utilizzare. Non imposta la suoneria del sistema. – CommonsWare

+1

Ok, forse mi sono perso ma il riferimento non lo dice esplicitamente.Mi chiedo cosa farebbe qualcuno con una suoneria nella sua applicazione a meno che l'app non gestisca le chiamate in arrivo. – russoue

0

Ho trovato questo codice dall'applicazione Media da Android.

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

queste opere formano il mio.

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

Questo ti aiuterà a impostare la suoneria dalla cartella raw dove hai messo tutte le tue suonerie. Funziona bene per anche io –

+0

soundFile = mCr.openAssetFileDescriptor (mUri, "r"); per favore, dimmi perché hai scritto questa frase. –

+0

cosa sono le applicazioni globali qui? – AndroidHacker

0

Questo è il codice che ho usato! spero che aiuti ..
Questo è anche il 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); 

CODICE FELICE!

0

Non riesco a commentare la soluzione perché non ho abbastanza reputazione sullo stack overflow ... Voglio solo aggiungere un modo per aggiungere il file audio nel database multimediale senza accedere direttamente al database e quindi evitare di ottenere duplicati. La soluzione è basata su MediaScannerConnection, questo è il codice che ho usato:

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

risposta da Vidar è troppo lungo e si aggiunge voci duplicate ogni volta che si desidera impostare un brano come suoneria. Invece dovresti provare questo

Uri newUri=Uri.parse("content://media/external/audio/media/"+ID); 
try { 
     RingtoneManager.setActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE, newUri); 
    } 
catch (Throwable t) { 


        } 
Problemi correlati