2012-11-12 35 views
7

Câu hỏi này có thể trùng lặp với this question nhưng tôi thấy một số khác biệt về mã, vì vậy tôi đặt một câu hỏi mới.Tại sao RingtoneManager.setActualDefaultRingtoneUri không thể hoạt động? [android API-8]

Vấn đề là tôi không thể đặt nhạc chuông đã chọn trong RingtonePicker. Tôi sử dụng Support LibraryAndroidAnnotations, có thể nó có thể gây ra vấn đề như vậy (mặc dù tôi nghi ngờ nó).

Tôi có Phân đoạn bằng một nút trong đó. Khi nhấp vào nút, RingtonePicker sẽ được kích hoạt. Người dùng chọn nhạc chuông và ứng dụng lưu nó trong SharedPreference. Lần tới khi người dùng mở RingtonePicker, nhạc chuông được chọn trước đó phải được chọn và tôi không thể thực hiện việc đó.

Đây là Fragment tôi

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

Trong hai từ câu hỏi là - tại sao RingtoneManager.setActualDefaultRingtoneUri không làm việc ở đây?

CẬP NHẬT:

tôi có quyền WRITE_SETTINGS trong manifest của tôi.

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

Câu hỏi này hơi cũ nhưng nếu bạn chưa bao giờ kết thúc khắc phục sự cố tôi đã có một chút kinh nghiệm về cài đặt nhạc chuông ngay bây giờ. Nếu bạn muốn đăng lỗi mà bạn có hoặc nếu bạn có thể mô tả lý do tại sao nó không hoạt động, tôi rất sẵn lòng trợ giúp. Nếu không, tôi rất muốn nhìn thấy câu trả lời cho câu hỏi này. –

+0

@Paradopolis Không, tôi không có bất kỳ lỗi nào. Nếu không ai biết tại sao phương pháp này không thể làm việc thì tôi mong đợi một số đoạn mã làm việc. –

+1

@VitaliiKorsakov: Có thể nó yêu cầu ''. Xem [tại đây] (http://developer.android.com/reference/android/Manifest.permission.html#MODIFY_AUDIO_SETTINGS) để biết thêm thông tin. Bạn có đang thử nghiệm mã của mình trên thiết bị bắt nguồn, không bắt nguồn từ hoặc trình giả lập không? – ChuongPham

Trả lời

2

Bạn cần chỉ định quyền ghi vào cài đặt trong tệp kê khai.

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

Cũng đăng đầu ra logcat của bạn.

+0

Xin lỗi, quên đề cập đến việc tôi có quyền này trong tệp kê khai. Và LogCat không làm rõ bất cứ điều gì kể từ khi ứng dụng của tôi không sụp đổ khi tung ra RingtonePicker, nó chỉ không chọn Ringtone tôi muốn từ danh sách. –

5

Ok vì vậy tôi đã gặp vấn đề tương tự như bạn. Tôi giả định rằng Uri bạn đang đi vào là một tập tin trong tài sản của bạn hoặc từ đĩa mà bạn đang lưu trữ trong một tập tin ưu tiên. Làm việc theo giả định này, vấn đề là bạn không thể đẩy một Uri vào RingtoneManager và mong đợi nó để có nó. Ui tệp phải đến từ trình phân giải nội dung.

Tôi rất thích nếu ai đó có thể cho tôi biết lý do chính xác, nhưng tôi không phải là chuyên gia vì vậy tôi chấp nhận nó như hiện nay. Điều đó đang được nói, mã này sẽ cho phép bạn lấy một Uri và đặt nó làm nhạc chuông mặc định.

//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 
    ); 
Các vấn đề liên quan