2012-11-12 10 views
7

Questa domanda può essere duplicata di this question ma vedo alcune differenze nel codice, quindi ho inserito una nuova domanda.Perché RingtoneManager.setActualDefaultRingtoneUri non ha potuto funzionare? [Android API-8]

Il problema è che non riesco a impostare la suoneria selezionata in RingtonePicker. Io uso Support Library e AndroidAnnotations, forse può causare tali problemi (anche se ne dubito).

Ho un frammento con un pulsante. Quando si fa clic sul pulsante viene attivato un RingtonePicker. L'utente seleziona suoneria e l'applicazione lo salva in SharedPreference. La prossima volta che l'utente apre RingtonePicker, la suoneria selezionata in precedenza deve essere controllata, e io non posso farlo.

Ecco il mio Frammento

@EFragment(R.layout.pref_page) 
public class PrefPage extends Fragment { 

    @Pref 
    MyPrefs_ myPrefs; 

    @Click(R.id.ringtone_button) 
    public void onClick() { 
     Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER); 
     intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, 
       RingtoneManager.TYPE_NOTIFICATION); 

     String uri = myPrefs.beepUri().get();  

     if (uri != "") {  
        Log.i("Log", "uri is " + uri);    
        RingtoneManager.setActualDefaultRingtoneUri(
          getActivity(), 
          RingtoneManager.TYPE_NOTIFICATION, 
          Uri.parse(uri)); 
     } 

     startActivityForResult(intent, 1); 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (resultCode == -1) { 
      Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI); 
      if (uri != null) { 
       String uriString = uri.toString(); 
       Log.i("Log", "uriString is " + uriString); 
       myPrefs.edit().beepUri().put(uriString).apply(); 
      } 
     } 
    } 
} 

In due parole domanda è - perché RingtoneManager.setActualDefaultRingtoneUri non funziona qui?

AGGIORNAMENTO:

ho il permesso WRITE_SETTINGS nel mio manifesto.

<uses-permission android:name="android.permission.WRITE_SETTINGS" ></uses-permission> 
+0

Questa domanda è un po 'vecchia ora ma, se non hai mai risolto il problema, ho avuto un po' di esperienza con l'impostazione di suonerie ora. Se vuoi pubblicare l'errore che avevi, o se puoi dare una descrizione del perché non funziona, sarei felice di aiutarti. Altrimenti, mi piacerebbe vedere una risposta a questa domanda. –

+0

@Paradopolis No, non ho avuto errori. Se nessuno sa perché questo metodo non potrebbe funzionare, mi aspetto un codice funzionante. –

+1

@VitaliiKorsakov: Forse richiede ''. Vedi [qui] (http://developer.android.com/reference/android/Manifest.permission.html#MODIFY_AUDIO_SETTINGS) per maggiori informazioni. Stai testando i tuoi codici su un dispositivo rooted, non rooted o emulatore? – ChuongPham

risposta

2

È necessario specificare il permesso di scrivere nelle impostazioni nel file manifest.

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

Inviare anche l'output logcat.

+0

Mi dispiace, ho dimenticato di dire che ho questo permesso in manifest. E LogCat non chiarisce nulla dal momento che la mia applicazione non si arresta in modo anomalo all'avvio di RingtonePicker, semplicemente non seleziona il Ringtone che voglio dall'elenco. –

5

Ok, quindi ho avuto lo stesso problema di te. Suppongo che l'Uri che stai passando sia un file nelle tue risorse o dal disco che stai memorizzando in un file delle preferenze. Lavorando sotto questa ipotesi, il problema è che non è possibile inserire un Uri nel RingtoneManager e aspettarsi che lo prenda. Il file uri dovrebbe provenire dal content resolver.

Mi piacerebbe molto se qualcuno potesse dirmi perché è esattamente così, ma io non sono un esperto, quindi lo accetto come è per ora. Detto questo, questo codice ti permetterà di prendere un Uri e impostarlo come suoneria predefinita.

//We get the Uri here fro ma file's absolute path. 
    Uri ringtoneUri = Uri.parse(file.getAbsolutePath()); 

    //We now create a new content values object to store all the information 
    //about the ringtone. 
    ContentValues values = new ContentValues(); 
    values.put(MediaStore.MediaColumns.DATA, chosenFile.getAbsolutePath()); 
    values.put(MediaStore.MediaColumns.TITLE, chosenFile.getName()); 
    values.put(MediaStore.MediaColumns.SIZE, chosenFile.length()); 
    values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3"); 
    values.put(AudioColumns.ARTIST, context.getString(R.string.app_name)); 
    values.put(AudioColumns.IS_RINGTONE, true); 
    values.put(AudioColumns.IS_NOTIFICATION, false); 
    values.put(AudioColumns.IS_ALARM, false); 
    values.put(AudioColumns.IS_MUSIC, false); 

    //Work with the content resolver now 
    //First get the file we may have added previously and delete it, 
    //otherwise we will fill up the ringtone manager with a bunch of copies over time. 
    Uri uri = MediaStore.Audio.Media.getContentUriForPath(chosenFile.getAbsolutePath()); 
    context.getContentResolver().delete(uri, MediaStore.MediaColumns.DATA + "=\"" + chosenFile.getAbsolutePath() + "\"", null); 

    //Ok now insert it 
    Uri newUri = context.getContentResolver().insert(uri, values); 

    //Ok now set the ringtone from the content manager's uri, NOT the file's uri 
    RingtoneManager.setActualDefaultRingtoneUri(
     context, 
     RingtoneManager.TYPE_RINGTONE, 
     newUri 
    ); 
Problemi correlati