2012-11-12 8 views
7

この質問はthis questionと重複する可能性がありますが、コードに若干の違いがあるので、私は新しい質問をします。なぜRingtoneManager.setActualDefaultRingtoneUriがうまくいかなかったのですか? [アンドロイドAPI-8]

RingtonePickerでピックアップされた着信音を設定できないという問題があります。私はSupport LibraryAndroidAnnotationsを使用しています。おそらくそれはそのような問題を引き起こす可能性があります(私はそれは疑いますが)。

ボタンが付いた断片があります。ボタンをクリックすると、RingtonePickerが起動します。ユーザーは着信音を選択し、アプリケーションはそれをSharedPreferenceに保存します。次回ユーザーがRingtonePickerを開くと、以前に選択した着信音をチェックする必要があります。ここで

は私の断片は、二つの単語の質問に

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

である - RingtoneManager.setActualDefaultRingtoneUriはここで働いていない理由?

更新日:

を、私は私のマニフェストでWRITE_SETTINGS権限を持っています。

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

この質問は少し古くなっていますが、問題が解決しなかった場合は、今すぐ着信音を設定する経験があります。あなたが持っていたエラーを投稿したい場合や、なぜそれが機能していないのか説明を付けることができれば、私は助けてくれるでしょう。さもなければ、私はこの質問への答えを見たいと思う。 –

+0

@Paradopolisいいえ、私は誤りを抱えていませんでした。なぜこの方法がうまくいかないのか誰も知らなければ、私は作業コードの一部を期待しています。 –

+1

@VitaliiKorsakov:おそらく ''が必要です。詳細については、[here](http://developer.android.com/reference/android/Manifest.permission.html#MODIFY_AUDIO_SETTINGS)を参照してください。根っこのルートになっていないデバイスやエミュレータでコードをテストしていますか? – ChuongPham

答えて

2

マニフェストファイルの設定に書き込む権限を指定する必要があります。

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

また、logcat出力を投稿してください。

+0

申し訳ありませんが、マニフェストにこの権限があることを忘れてしまいました。また、RingtonePickerを起動するときにアプリケーションがクラッシュしないため、LogCatは何も明確にしません。リストから必要な着信音を選択するだけではありません。 –

5

私はあなたと同じ問題を抱えていました。あなたが渡しているUriがあなたの資産の中のファイルであるか、またはあなたが設定ファイルに格納しているディスクであると仮定しています。この前提のもとでは、UriをRingtoneManagerに押し込み、それを取ることができないという問題があります。ファイルuriはコンテンツリゾルバから来るはずです。

なぜ誰かが私にそれを正確に伝えることができたら大好きですが、私は専門家ではないので、今のようにそれを受け入れています。つまり、このコードではUriを使用してデフォルトの着信音として設定します。

//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 
    ); 
関連する問題