You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

查询应用外创建的MediaStore.Downloads文件无返回是否为权限问题

问题结论

这个情况属于分区存储(Scoped Storage)规则下的访问权限限制问题,不是查询代码逻辑错误,是Android系统对公共目录文件访问权限的默认过滤机制导致的。

根本原因

Android 10(API 29)开始引入的分区存储规则默认限制了应用对公共目录文件的访问权限:

  • 应用对自己通过MediaStore.insert()方法写入公共目录的文件,默认拥有读写权限,查询时会正常返回结果
  • 其他应用、用户手动上传/创建的公共目录文件,就算存放在相同路径下,应用默认没有访问权限,执行query()查询时系统会自动将这类无权访问的条目从返回结果中过滤,所以会出现查询无返回的情况

排查与解决方法

按应用适配的目标SDK版本选择方案

  • 目标SDK ≤ 28:只要申请READ_EXTERNAL_STORAGE动态权限,就能正常查询到所有Download目录下的文件
  • 目标SDK = 29~32:可以在AndroidManifest.xml的<application>节点下添加android:requestLegacyExternalStorage="true"属性,临时启用旧版存储权限模型,即可绕过分区存储限制查询到所有文件,该属性在API 33及以上版本会自动失效
  • 目标SDK ≥33:
    • 如果你要访问的是图片、音视频类媒体文件,申请对应READ_MEDIA_IMAGES/READ_MEDIA_VIDEO/READ_MEDIA_AUDIO动态权限即可查询到其他应用创建的对应类型文件
    • 如果你要访问CSV这类非媒体文件,有两种可选方案:
      • 申请MANAGE_EXTERNAL_STORAGE特殊权限,适合文件管理器、文档处理类工具应用,注意该权限需要应用分发平台额外审核
      • 引导用户通过系统存储访问框架(SAF)主动授权Download/MyApp目录的访问权限,授权后即可正常查询该目录下的所有文件

可选代码优化

你当前的路径匹配逻辑没有问题,如果你要避免LIKE匹配的误命中,可以改成精确前缀匹配:

String selection = MediaStore.Downloads.RELATIVE_PATH + " = ? ";
// appfoldername = "MyApp"
String[] selectionArgs = new String[]{
        Environment.DIRECTORY_DOWNLOADS + File.separator + appfoldername + File.separator
};

Cursor cursor  = resolver.query(MediaStore.Downloads.EXTERNAL_CONTENT_URI,
        new String[] {MediaStore.MediaColumns.RELATIVE_PATH, MediaStore.MediaColumns._ID, MediaStore.MediaColumns.DISPLAY_NAME, MediaStore.MediaColumns.MIME_TYPE}, selection, selectionArgs, null);

内容的提问来源于stack exchange,提问作者MakoShark2

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 04:15:02