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

Android 11+如何获取公共目录下的所有文件名

问题根源

读不到其他应用在公共目录创建的文件,是Android分区存储机制的默认限制:从API 29开始系统默认启用分区存储,应用默认只能访问自身私有目录、以及自己创建的公共目录文件,没有权限直接读取其他应用生成的公共存储文件。

具体解决方法

根据你项目的targetSdk版本选择对应方案:

Android 13(API 33)及以上版本

  • 旧版的READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE权限在这个版本已经完全作废,申请了也没用。
  • 要遍历读取Documents目录下所有文件(含其他应用创建的),必须申请全文件访问权限:
    1. 先在AndroidManifest.xml中声明权限:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
  1. 代码中判断权限状态,未授权的话跳转到系统授权页引导用户手动开启:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    if (!Environment.isExternalStorageManager()) {
        Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
        intent.setData(Uri.parse("package:" + getPackageName()));
        startActivity(intent);
    }
}

用户授权完成后,你原来写的folder.listFiles()逻辑就能正常拿到该目录下的所有文件,不管是哪个应用创建的。
注意:如果应用要上架Google Play,这个权限只有文件管理、数据备份恢复这类确实需要访问全量存储的应用才能通过审核,普通应用滥用会被直接拒审。

Android 11(API 30)、Android 12(API 31/32)

  • 方案和上面API33+一致,走MANAGE_EXTERNAL_STORAGE权限申请流程即可。
  • 临时兼容可以在Manifest的<application>标签下加android:requestLegacyExternalStorage="true"关闭分区存储,但这个配置只是过渡用,API30以上后续版本会直接忽略这个配置,不要长期依赖。

Android 10(API 29)及更低版本

  • 只需要在Manifest声明读写外部存储的常规权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" />
  • 动态申请这两个危险权限,用户同意授权后就能正常读取公共目录下的所有文件。
替代方案(无高风险权限)

如果你不需要遍历整个存储,只是要读取指定目录下的特定类型文件,不需要申请全文件访问权限,可以用系统自带的存储访问框架(SAF),让用户手动选择目标com.krunaldhoriya.stockmanager文件夹,拿到该目录的持久化Uri权限后,就可以通过ContentResolver遍历读取里面的所有文件,这种方式不需要申请高风险权限,上架应用市场不会被卡。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 21:24:30