这是我用来将Uri的字符串表示形式保存到SharedPreferences的代码:
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQ_CODE_PICK_SOUNDFILE && resultCode == Activity.RESULT_OK){
if ((data != null) && (data.getData() != null)){
SharedPreferences sharedPref = getSharedPreferences("customName", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("uritostring", data.getData().toString());
editor.apply();
}
}
}
请注意,当我在此处附加以下两个选项之一时,它可以正常工作:
MediaPlayer mp=MediaPlayer.create(this,data.getData());
MediaPlayer mp=MediaPlayer.create(this,Uri.parse(data.getData().toString()));
但是,当我稍后尝试在另一个 Activity 中创建MediaPlayer时,它不起作用:
SharedPreferences sharedPref = getSharedPreferences("customName", Context.MODE_PRIVATE);
Uri uri = Uri.parse(sharedPref.getString("uritostring","defaultUriString"));
mp.create(this,uri);
我不知道将保存和加载到sharedPreferences有何合理的区别。据我所知,从调试来看uri与上面的Uri.parse(data.getData()。toString())的结果相同。
任何帮助和指针,我们将不胜感激。
最好的祝福
朱利叶斯
编辑:
我以为我可以通过使用
MediaPlayer.create()
上下文调用getApplicationContext()
方法来解决此问题,但是关闭应用程序并重新打开它会使方法调用再次失灵。 最佳答案
发生了相同的问题,并在此处找到了解决方案:
http://www.andreamaglie.com/access-storage-framework-uri-permission/
和这里
https://stackoverflow.com/a/25194460/1993098
当您使用KitKat +(SDK 19+)时,此修复程序将为您提供帮助。基本上,当您从首选项中保存和检索URI时,您会失去访问文件的权限。通过上述步骤,您可以保留系统的此权限,因此以后将允许该应用访问文件。例如,我用它来选择一个警报声音,随后将被触发的服务取回并播放。
总结一下(同样,如果在一段时间后无法访问第一个站点):
需要权限
<uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
获取URI (使用ACTION_OPEN_DOCUMENT很重要)
Intent audioIntent = new Intent();
audioIntent.setType("audio/*");
audioIntent.setAction(Intent.ACTION_OPEN_DOCUMENT);
audioIntent.addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult(audioIntent, PICK_AUDIO_REQUEST);
读取URI并保留读取的权限(在onActivityResult中)
Uri alarmSoundUri = data.getData();
getActivity().grantUriPermission(getActivity().getPackageName(), alarmSoundUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
final int takeFlags = data.getFlags() & Intent.FLAG_GRANT_READ_URI_PERMISSION;
// Check for the freshest data.
//noinspection WrongConstant
getActivity().getContentResolver().takePersistableUriPermission(alarmSoundUri, takeFlags);
getPrefs().setAlarmSoundUri(alarmSoundUri.toString());
从首选项检索URI
String alarmSoundUri = getPrefs().getAlarmSoundUri();
Uri parsedUri = Uri.parse(alarmSoundUri);
...
getPrefs()...显然必须是您自己的首选项实现。