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

Android外部存储指定目录读取文件失败,listFiles返回数量为0

Android 外部存储目录存在但listFiles()返回空列表解决方案
  • 首先排查应用目标版本对应的权限配置:
    若你的targetSdkVersion >= 30(对应Android 11及以上系统),普通读写存储权限无法访问公共目录文件,需要额外做如下配置:
    1. 在AndroidManifest.xml中添加所有文件管理权限:
    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
    
    1. 代码中主动跳转权限设置页,引导用户手动开启「允许访问所有文件」权限:
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 21:45:07