gpt4 book ai didi

android - 将 uri 保存到 sharedPreferences 并使用 mediaplayer 播放

转载 作者:太空宇宙 更新时间:2023-11-03 11:07:39 26 4
gpt4 key购买 nike

这是我用来将 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()) 的结果相同。

非常感谢任何帮助和指点。

最好的问候

朱利叶斯

编辑:

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

最佳答案

有同样的问题并在这里找到了解决方案:
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()...显然必须是您自己的偏好实现。

关于android - 将 uri 保存到 sharedPreferences 并使用 mediaplayer 播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31116103/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com