Android 11调用listFiles()出现NullPointerException问题求助
Android 11下SAF路径调用listFiles()报空指针的解决办法
你遇到的问题核心在于:通过ActivityResultContracts.OpenDocumentTree()拿到的/tree/primary:SHAREit Lite/pictures这类路径,是存储访问框架(SAF)的特殊Uri格式,并非传统的本地文件系统路径。File类无法识别这种路径对应的实际目录结构,所以调用listFiles()必然返回null,用!!强制非空就会触发空指针异常。
解决方式是放弃用File类操作,改用SAF对应的DocumentFile来处理:
- 不要将返回的Uri转成
path存储,直接保留Uri对象 - 用
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
相关产品推荐
相关产品推荐

