Android 11+如何获取公共目录下的所有文件名
问题根源
读不到其他应用在公共目录创建的文件,是Android分区存储机制的默认限制:从API 29开始系统默认启用分区存储,应用默认只能访问自身私有目录、以及自己创建的公共目录文件,没有权限直接读取其他应用生成的公共存储文件。
具体解决方法
根据你项目的targetSdk版本选择对应方案:
Android 13(API 33)及以上版本
- 旧版的
READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE权限在这个版本已经完全作废,申请了也没用。 - 要遍历读取Documents目录下所有文件(含其他应用创建的),必须申请全文件访问权限:
- 先在
AndroidManifest.xml中声明权限:
- 先在
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
- 代码中判断权限状态,未授权的话跳转到系统授权页引导用户手动开启:
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
相关产品推荐
相关产品推荐

