You need to enable JavaScript to run this app. 安卓端Kotlin调用File().walk()无法遍历目录内文件如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

安卓端Kotlin调用File().walk()无法遍历目录内文件如何解决?

问题原因

安卓10(API 29)及以上版本引入了分区存储机制,传统的READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE权限仅能访问应用自身沙盒目录和媒体库特定分类文件,无法直接访问公共存储的自定义目录,就会出现Permission denied报错。File.walk()仅返回目标目录本身,是因为没有读取子目录内容的权限,系统不会将子文件、子目录返回给调用方,因此过滤非目录的代码分支始终无法触发。
另外安卓6.0(API 23)及以上版本的危险权限需要主动做运行时申请,仅在清单文件注册权限也会导致授权不生效。

解决方案

根据你的应用适配场景可选择以下方案:

方案1:适配分区存储(符合Google Play上架要求,推荐)

  • 如果你操作的是公共媒体类文件(图片、音视频、文档),改用MediaStore API查询获取文件Uri进行操作,不要直接使用原生File API
  • 如果需要操作用户指定的任意目录,调用系统存储访问框架(SAF)引导用户主动授权目标目录,拿到授权后即可正常读写该目录下的所有内容,无需申请全量存储权限

方案2:安卓10过渡适配

如果你的应用暂时不需要适配安卓11及以上版本,可在AndroidManifest.xml的application标签中添加属性,沿用旧版存储权限逻辑:

android:requestLegacyExternalStorage="true"

注意该属性在安卓11及以上版本会失效。

方案3:申请全量文件访问权限(适用于文件管理类应用)

如果你的应用需要访问公共存储的所有文件,可申请全量存储权限:

  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_APP_ALL_FILES_ACCESS_PERMISSION)
    intent.data = Uri.parse("package:${packageName}")
    startActivityForResult(intent, 1001)
}

授权完成后即可用File API正常遍历目标目录的所有文件。

额外注意:运行时权限申请

安卓6.0及以上版本需要主动申请危险权限,不能仅在清单文件注册,读写存储权限的运行时申请示例如下:

if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, 
        arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE), 
        1002
    )
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 17:39:03