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

Android 11调用listFiles()出现NullPointerException问题求助

Android 11下SAF路径调用listFiles()报空指针的解决办法

你遇到的问题核心在于:通过ActivityResultContracts.OpenDocumentTree()拿到的/tree/primary:SHAREit Lite/pictures这类路径,是存储访问框架(SAF)的特殊Uri格式,并非传统的本地文件系统路径。File类无法识别这种路径对应的实际目录结构,所以调用listFiles()必然返回null,用!!强制非空就会触发空指针异常。

解决方式是放弃用File类操作,改用SAF对应的DocumentFile来处理:

  1. 不要将返回的Uri转成path存储,直接保留Uri对象
  2. 用DocumentFile.fromTreeUri()创建可操作的文档对象,再遍历文件

示例代码:

// 注册目录选择的ActivityResult
registerForActivityResult(ActivityResultContracts.OpenDocumentTree()) { treeUri ->
    treeUri?.let { uri ->
        // 可选:持久化权限,避免重启APP后失去访问权限
        contentResolver.takePersistableUriPermission(
            uri,
            Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
        )
        
        // 创建DocumentTree对象
        val treeDocument = DocumentFile.fromTreeUri(this, uri)
        // 遍历目录下的文件/子目录
        treeDocument?.listFiles()?.forEach { docFile ->
            // 处理文件,比如获取名称、判断是否是目录
            val fileName = docFile.name ?: "未知文件"
            val isDirectory = docFile.isDirectory
            // 这里写你的业务逻辑
        }
    }
}

另外要注意:Android 11及以上版本,即使申请了READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE权限,也无法直接用File类访问SAF选择的目录,必须通过SAF提供的API操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 00:15:33