Android系统如何使用MediaStore访问其他应用创建的媒体文件
Android 10读取其他应用创建的公共媒体文件解决方案
你遇到的报错是Android 10引入的分区存储限制导致的,默认应用只能访问自身向MediaStore写入的媒体文件,要访问其他应用创建的公共媒体文件,需要按以下步骤修改:
1. 权限配置与申请
- 清单文件声明对应权限:
- 若targetSdkVersion ≤ 32,声明
READ_EXTERNAL_STORAGE权限 - 若targetSdkVersion ≥ 33,声明
READ_MEDIA_AUDIO权限
- 若targetSdkVersion ≤ 32,声明
- 上述权限都属于运行时权限,必须在代码中主动发起申请,拿到用户授权后才能访问媒体文件
- 临时适配方案:如果不想做分区存储适配,可在
AndroidManifest.xml的<application>节点添加属性android:requestLegacyExternalStorage="true",即可在Android 10设备上沿用旧版存储访问逻辑
2. 代码逻辑修正
你当前代码中调用getPathFromUri(testUri)拿到原始文件路径传给MediaPlayer的逻辑是错误的,分区存储规则下,你没有权限直接访问其他应用创建文件的原始路径,会触发权限拒绝的报错。正确做法是直接使用MediaStore查询得到的Uri设置数据源:
// 错误用法:用转出来的本地路径设置 // mediaPlayer.setDataSource(getPathFromUri(testUri)); // 正确用法:直接传入MediaStore返回的Uri mediaPlayer.setDataSource(context, uri); mediaPlayer.prepareAsync();
3. 补充注意点
- 查询MediaStore时的筛选条件
RELATIVE_PATH要保证和其他应用写入文件时的路径完全一致,注意末尾斜杠、大小写等差异,避免查询不到其他应用写入的文件 - 注意:
android:requestLegacyExternalStorage仅在Android 10设备上生效,Android 11及以上系统会忽略该属性,长期适配建议直接使用Uri访问媒体资源,不要依赖原始文件路径
内容的提问来源于stack exchange,提问作者swiftbegineer
相关产品推荐
相关产品推荐

