Android 12代码读取Downloads目录仅显示部分文件,与Files应用不一致
问题原因及解决方案
核心原因:Android 12的存储权限限制
从Android 11(API 30)起的分区存储机制,在Android 12(API 31)中进一步强化:
Environment.getExternalStoragePublicDirectory()已被废弃,不再推荐用于访问公共存储目录。- 应用默认仅能访问自身创建的文件,以及公共目录内的媒体文件(图片、音频、视频)。你能读取短信下载的图片,是因为它们属于媒体范畴;而Excel文件属于非媒体类文档,应用无直接读取权限。
文件实际位置
文件确实在系统Files显示的公共Downloads目录(/storage/emulated/0/Download),只是你的应用没有权限访问这类非媒体文件。
可行解决方式
- 使用存储访问框架(SAF):通过
ACTION_OPEN_DOCUMENT或ACTION_GET_CONTENT让用户手动选择文件,无需特殊权限,是官方推荐的非媒体文件访问方式。 - 申请MANAGE_EXTERNAL_STORAGE权限:若应用需批量访问公共目录全量文件,可在Manifest中添加权限:
再在代码中动态请求权限,但该权限仅适用于文件管理器类特定应用,普通应用提交Google Play可能被拒。<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" android:minSdkVersion="30" /> - MediaStore API(仅适用于媒体文件):此方法仅能访问媒体类型文件,不适用Excel等文档。
内容的提问来源于stack exchange,提问作者James_B
相关产品推荐
相关产品推荐

