2012-11-12 9 views
7

To pytanie może być duplikatem numeru this question, ale widzę pewną różnicę w kodzie, więc zadałem nowe pytanie.Dlaczego funkcja RingtoneManager.setActualDefaultRingtoneUri nie mogła działać? [Android API-8]

Problem polega na tym, że nie można ustawić wybranego dzwonka w aplikacji RingtonePicker. Używam Support Library i AndroidAnnotations, może to może powodować takie problemy (choć wątpię w to).

Mam Fragment z przyciskiem w nim. Kliknięcie przycisku uruchamia RingtonePicker. Użytkownik wybiera dzwonek i aplikacja zapisuje go w SharedPreference. Następnym razem, gdy użytkownik otworzy RingtonePicker, wybrany wcześniej dzwonek powinien zostać sprawdzony i nie mogę tego zrobić.

Oto moja Fragment

@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(); 
      } 
     } 
    } 
} 

w dwóch słowach pytanie - dlaczego RingtoneManager.setActualDefaultRingtoneUri nie pracuje tutaj?

AKTUALIZACJA:

mam pozwolenie WRITE_SETTINGS w moim manifestu.

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

To pytanie jest trochę stare, ale jeśli nigdy nie doszło do rozwiązania problemu, miałem już trochę doświadczenia z ustawianiem dzwonków. Jeśli chcesz opublikować błąd, który popełniłeś, lub możesz podać opis, dlaczego to nie działa, chętnie pomogę. W przeciwnym razie chciałbym zobaczyć odpowiedź na to pytanie. –

+0

@Paradopolis Nie, nie miałem żadnych błędów. Jeśli nikt nie wie, dlaczego ta metoda nie mogła działać, oczekuję jakiegoś działającego kodu. –

+1

@VitaliiKorsakov: Może wymaga ''. Aby uzyskać więcej informacji, zobacz [tutaj] (http://developer.android.com/reference/android/Manifest.permission.html#MODIFY_AUDIO_SETTINGS). Czy testujesz swoje kody na zrootowanym, nierootowanym urządzeniu lub emulatorze? – ChuongPham

Odpowiedz

2

Musisz określić uprawnienia do zapisu w ustawieniach w pliku manifestu.

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

Napisz również swoje dane wyjściowe logcat.

+0

Przepraszam, zapomniałem wspomnieć, że mam to pozwolenie w manifeście. I LogCat niczego nie wyjaśnia, ponieważ moja aplikacja nie zawiesza się podczas uruchamiania RingtonePicker, po prostu nie wybiera z listy żądanego dzwonka. –

5

Ok, więc miałem ten sam problem co ty. Zakładam, że Uri, którego przekazujesz, jest plikiem w twoim majątku lub z dysku, który przechowujesz w pliku preferencji. Pracując zgodnie z tym założeniem, problem polega na tym, że nie można wepchnąć Uri do RingtoneManager i oczekiwać, że go weźmie. Plik uri powinien pochodzić z resolvera treści.

Bardzo bym chciał, gdyby ktoś mógł mi powiedzieć, dlaczego tak jest, ale nie jestem ekspertem, więc akceptuję go jak na razie. Biorąc to pod uwagę, ten kod pozwoli ci wziąć Uri i ustawić go jako domyślny dzwonek.

//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 
    ); 
Powiązane problemy