Android外部存储指定目录读取文件失败,listFiles返回数量为0
Android 外部存储目录存在但
listFiles()返回空列表解决方案 - 首先排查应用目标版本对应的权限配置:
若你的targetSdkVersion >= 30(对应Android 11及以上系统),普通读写存储权限无法访问公共目录文件,需要额外做如下配置:- 在
AndroidManifest.xml中添加所有文件管理权限:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />- 代码中主动跳转权限设置页,引导用户手动开启「允许访问所有文件」权限:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && !Environment.isExternalStorageManager()) { val intent = Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION) startActivity(intent) } - 在
- 确认动态权限是否真的授权成功:
Android 6.0(API 23)以上存储权限属于危险权限,仅在Manifest中声明无效,必须在运行时调用权限申请接口,待用户同意后才真正获取权限。你可以在读取目录前加入权限校验代码:val hasReadPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED // 权限未获取时先申请权限再执行文件读取逻辑 - 适配Android 10 分区存储兼容配置:
若你的targetSdkVersion = 29(对应Android 10系统),可以在AndroidManifest.xml的application节点添加兼容配置,临时关闭分区存储限制:<application android:requestLegacyExternalStorage="true" ...> - 确认目录路径的来源是否正确:
若你构建logsDir时传入的dir是通过context.getExternalFilesDir()获取的,对应的是应用私有目录(路径为/storage/emulated/0/Android/data/你的应用包名/files/),和根目录下的/storage/emulated/0/TestFiles不是同一个路径。要访问根目录公共路径需要用Environment.getExternalStorageDirectory()作为父目录构建文件对象。 - 排查媒体库扫描延迟问题:
手动存入目录的文件不会被系统实时扫描收录,你可以尝试重启设备,或者调用媒体扫描接口更新媒体库后再读取文件列表。也可以直接使用系统存储访问框架(SAF)实现文件读取,不受权限和媒体库扫描限制。
内容的提问来源于stack exchange,提问作者jaycee
相关产品推荐
相关产品推荐

