Android 将uri保存到SharedReferences并使用mediaplayer播放

Android 将uri保存到SharedReferences并使用mediaplayer播放,android,sharedpreferences,uri,android-mediaplayer,Android,Sharedpreferences,Uri,Android Mediaplayer,这是我用来将Uri的字符串表示形式保存到SharedReferences的代码: public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQ_CODE_PICK_SOUNDFILE && resultCode == A

这是我用来将Uri的字符串表示形式保存到SharedReferences的代码:

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()));
但是,当我稍后在其他类似活动中尝试创建MediaPlayer时,它不起作用:

SharedPreferences sharedPref = getSharedPreferences("customName", Context.MODE_PRIVATE);
Uri uri = Uri.parse(sharedPref.getString("uritostring","defaultUriString"));
mp.create(this,uri);
我不知道保存和加载到SharedReference会有什么不同。从调试中我可以看出,uri与上面的uri.parse(data.getData().toString())的结果相同

非常感谢您的帮助和指点

致意

朱利叶斯

编辑:


我想我通过使用
getApplicationContext()
上下文调用
MediaPlayer.create()
方法解决了这个问题,但是关闭应用程序并重新打开它会使方法调用再次失效。

也有同样的问题,并在这里找到了解决方案:

在这里

当您使用KitKat+(SDK 19+)时,此修复程序将对您有所帮助。基本上,当您从首选项保存和检索URI时,您失去了访问该文件的权限。通过上述步骤,您可以通过系统保留此权限,以便允许应用程序稍后访问该文件。例如,我用它来选择一个警报声,稍后会被触发的服务检索并播放

总而言之(也是在一段时间后无法到达第一个站点的情况下):

需要许可

<uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
读取URI并保持读取权限(在onActivityResult中)

从首选项检索URI

String alarmSoundUri = getPrefs().getAlarmSoundUri();
Uri parsedUri = Uri.parse(alarmSoundUri);
...

getPrefs()。。。显然,这必须是您自己的首选实现。

您找到解决方案了吗
        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());
String alarmSoundUri = getPrefs().getAlarmSoundUri();
Uri parsedUri = Uri.parse(alarmSoundUri);
...