2011-01-05 14 views
16

Ho salvato il file nella cartella sdcard/media/audio/ringtone s. Tale file verrà visualizzato nell'elenco di selezione suoneria dalla suoneria settings/sound/phone.impostazione file audio come suoneria

Ma voglio impostare quel file come suoneria dal mio codice. Ecco il mio codice.

File k = new File(path, filename); 

    ContentValues values = new ContentValues(); 
    values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath()); 
    values.put(MediaStore.MediaColumns.TITLE, "TwiAppclip"); 
    values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/*"); 
    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, false); 
    values.put(MediaStore.Audio.Media.IS_MUSIC, false); 

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

    RingtoneManager.setActualDefaultRingtoneUri(getApplicationContext(), 
     RingtoneManager.TYPE_RINGTONE, newUri); 

qui uri sto ottenendo Ma ho newUri = null. Penso che sia per questo che non è impostato come suoneria.

Qualcuno sa dov'è il problema? come si ottiene newUri corretto?

+1

se ho messo la mia cartella suonerie sul grezzo, che cosa devo specificare come PATH? :) – Roylee

risposta

35

L'audio è impostato come suoneria solo una volta, ma la soluzione a questo problema è - Se si sta tentando di eseguire nuovamente lo stesso codice, si inserirà una voce duplicata nella tabella di MediaStore, ma il database SQLite non consentirà tu. Devi rinominare il file e aggiungerne un'altra, oppure entrare, rimuovere la voce e riprovare. Quindi ho rimosso quella voce ogni volta e poi l'ho inserita di nuovo.

Uri uri = MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath()); 
getContentResolver().delete(uri, MediaStore.MediaColumns.DATA + "=\"" + k.getAbsolutePath() + "\"", null); 
Uri newUri = getContentResolver().insert(uri, values); 

RingtoneManager.setActualDefaultRingtoneUri(activity.this, 
     RingtoneManager.TYPE_RINGTONE, newUri); 
+2

Genio! Grazie, ho cercato dappertutto la sintassi su come interrogare correttamente per un duplicato. – Nick

+0

Grazie amico. È stato perfetto. Lo stavo cercando da settimane e tu sai cosa. Il blocco catch cattura questa eccezione, ma la variabile exception è null. Non avevo idea che potesse essere questo problema. Grazie: D – drulabs

+1

-1 per questa risposta in quanto non funziona! Mancanza di controllo per eliminare, quindi questo codice che circonda ottenere l'Uri e fare l'eliminazione è il codice pigro! La risposta più corretta sarebbe stata ottenere lo _ID del supporto e questo int nRowsDeleted = getContentResolver(). Delete (Uri.parse (MediaStore.Audio.Media.EXTERNAL_CONTENT_UR I + "/" + _ID), null, null); if (nRowsDeleted> 0) {// delete worked} else {// delete failed} – t0mm13b

1
RingtoneManager.setActualDefaultRingtoneUri(
Context, 
RingtoneManager.TYPE_RINGTONE, 
Uri 
.parse("Media file uri")); 

Penso che questo risolva il tuo problema.

+2

Non penso che tu abbia ottenuto la domanda. – drulabs

3

Invece di eliminare gli uri precedentemente inseriti, è possibile riutilizzarlo:

// check if file already exists in MediaStore 
    String[] projection = {MediaStore.Audio.Media._ID}; 
    String selectionClause = MediaStore.Audio.Media.DATA + " = ? "; 
    String[] selectionArgs = {ringtoneFile.getAbsolutePath()}; 
    Cursor cursor = context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, projection, selectionClause, selectionArgs, null); 
    Uri insertedUri; 
    if (cursor == null || cursor.getCount() < 1) { 
     // not exist, insert into MediaStore 
     ContentValues cv = new ContentValues(); 
     cv.put(MediaStore.Audio.Media.DATA, ringtoneFile.getAbsolutePath()); 
     cv.put(MediaStore.MediaColumns.TITLE, ringtoneFile.getName()); 
     insertedUri = context.getContentResolver().insert(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, cv); 
    } else { 
     // already exist 
     cursor.moveToNext(); 
     long id = cursor.getLong(0); 
     insertedUri = ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id); 
    } 
    RingtoneManager.setActualDefaultRingtoneUri(context, type, insertedUri); 
+0

Questo significava "sostituire" la suoneria precedente? –