这个问题可能与这个问题重复,但我看到代码有些不同,所以我提出了一个新问题.
问题是我无法在RingtonePicker中设置选择的铃声.我使用支持库和AndroidAnnotations,也许它可能导致这样的问题(虽然我对此表示怀疑).
我有片段,里面有一个按钮.单击按钮时会触发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();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
用两个词来说问题是 - 为什么RingtoneManager.setActualDefaultRingtoneUri在这里不起作用?
更新:
我的清单中有WRITE_SETTINGS权限.
<uses-permission android:name="android.permission.WRITE_SETTINGS" ></uses-permission>
Run Code Online (Sandbox Code Playgroud)
好的,我和你有同样的问题.我假设您传入的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
);
Run Code Online (Sandbox Code Playgroud)
您需要指定写入清单文件中的设置的权限。
<uses-permission android:name="android.permission.WRITE_SETTINGS" ></uses-permission>
Run Code Online (Sandbox Code Playgroud)
还发布您的 logcat 输出。