2012-11-12 6 views
7

이 질문은 this question과 중복 될 수 있지만 코드에 약간의 차이가 있으므로 새로운 질문을 드리겠습니다.왜 RingtoneManager.setActualDefaultRingtoneUri가 작동하지 않았습니까? [android API-8]

RingtonePicker에서 선택한 벨소리를 설정할 수없는 문제가 있습니다. 나는 Support LibraryAndroidAnnotations을 사용합니다. 아마도 그런 문제를 일으킬 수 있습니다.

버튼이있는 조각이 있습니다. 버튼을 클릭하면 RingtonePicker가 실행됩니다. 사용자 선택 벨소리 및 응용 프로그램이 SharedPreference에 저장합니다. 다음 번에 사용자가 RingtonePicker를 열면 이전에 선택한 벨소리를 확인해야하며 그럴 수 없습니다. 을 RingtoneManager.setActualDefaultRingtoneUri 여기에 작동하지 않는 이유 - 여기

내 조각 두 단어 질문에서

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

이다?

업데이트 :

내 매니페스트의 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

죄송합니다. 매니페스트에이 권한이 있음을 잊어 버렸습니다. 그리고 LogCat은 RingtonePicker를 시작할 때 응용 프로그램이 충돌하지 않기 때문에 아무 것도 명확하게하지 않습니다. 목록에서 원하는 벨소리를 선택하지 않습니다. –

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 
    ); 
관련 문제