为什么RingtoneManager.setActualDefaultRingtoneUri无法正常工作?

这个问题可能是这个问题的重复,但我看到代码的一些区别,所以我提出了一个新的问题。

问题是我不能在RingtonePicker中设置挑选的铃声。 我使用支持库和AndroidAnnotations ,也许它可以导致这样的问题(虽然我怀疑它)。

我有片段,里面有一个button。 当点击button时,RingtonePicker被触发。 用户select铃声和应用程序将其保存在SharedPreference中。 当用户打开RingtonePicker时,应该检查以前select的铃声,我不能这样做。

这是我的片段

@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> 

Solutions Collecting From Web of "为什么RingtoneManager.setActualDefaultRingtoneUri无法正常工作?"

好,所以我和你有同样的问题。 我假设你传入的Uri是一个文件在你的资产或从你存储在首选项文件中的磁盘。 在这个假设下工作的问题是,你不能推Uri到RingtoneManager,并期望它采取它。 文件uri应该来自内容parsing器。

如果有人能告诉我为什么那么正确,我会喜欢它,但我不是专家,所以我现在接受它。 这就是说,这段代码将让你拿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 ); 

您需要指定写入清单文件中的设置的权限。

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

同时发布您的logcat输出。