Android应用通过Uri播放同目录外部音频失败,求替代ACTION_OPEN_DOCUMENT_TREE方案
应用功能说明
- 允许用户从手机存储中选择XML文件
- 通过
ACTION_OPEN_DOCUMENT(原ACTION_GET_CONTENT)Intent打开XML文件,借助XML的Uri创建临时File读取内容(应用原本仅处理File而非Uri) - XML数据包含一个音频文件路径,该音频始终与XML位于同一目录下,示例:
- XML路径:myStorage/myProject/example.xml
- 音频文件:myStorage/myProject/audio/audioSample.mp3
- 读取完XML数据后,用户打开新Fragment,其中的MediaPlayer需要播放上述音频文件
- MediaPlayer原本使用应用内部资源路径作为测试音频,例如
"content://" + "com.my.app/" + "audio/audioSample.mp3",同时支持通过Uri而非路径字符串播放媒体
问题描述
- 无法播放应用内部资源以外的外部音频文件
已尝试方案
- 使用MediaPlayer的Uri和路径字符串两种播放方式
- 硬编码“audioSample”的绝对路径字符串
- 基于XML原始Uri创建新Uri,例如
"content://interalStorage/myProject:audio/audioSample.mp3" - 对Uri路径的最后部分进行编码(参考用户直接选择音频文件时系统生成的Uri格式)
- 直接复制系统生成的音频文件Uri并硬编码
- 得到自认为正确的Uri后,出现错误:
No persistable permission grants found for UID 10476 and Uri content://com.android.externalstorage.documents/document/primary:myProject/audio/audioSample.mp3。查阅资料了解到takePersistableUriPermission选项,但存在问题:- 该方法与
fileChooserResultLauncher兼容性不佳,仅适配已废弃的onActivityResult - 权限仅针对单个文件,无法覆盖整个“myProject”目录;因此考虑使用
ACTION_OPEN_DOCUMENT_TREE
- 该方法与
提问
除ACTION_OPEN_DOCUMENT_TREE外,是否有其他解决方案?另外,能否将目录权限请求包含在原有Intent中,还是必须让用户进行两次选择(一次选XML,一次选目录)?
内容的提问来源于stack exchange,提问作者Vento
相关产品推荐
相关产品推荐

