使用Intent.ACTION_OPEN_DOCUMENT_TREE获取目录后无法创建子目录?
问题根源
你通过ACTION_OPEN_DOCUMENT_TREE获取的是存储访问框架(SAF)的内容URI,这类URI以content://开头,并非文件系统的绝对路径。调用Uri.getPath()拿到的是SAF内部的虚拟路径,无法直接映射到真实文件系统位置,因此用File类创建cache目录的操作完全无效。另外mkdirs()失败时会返回false,但你未判断该返回值,导致无法捕获失败状态。
修正方案
放弃使用File类操作SAF目录,改用Android官方推荐的DocumentFileAPI来创建子目录:
1. 修改doStuff()方法
void doStuff() { // 将SAF返回的Uri转换为DocumentFile实例 DocumentFile rootDir = DocumentFile.fromTreeUri(this, Prefs.externalURI); if (rootDir != null) { // 检查cache目录是否存在,不存在则创建 DocumentFile cacheDir = rootDir.findFile("cache"); if (cacheDir == null) { cacheDir = rootDir.createDirectory("cache"); } // 后续可基于cacheDir进行文件操作,例如创建文件 // DocumentFile testFile = cacheDir.createFile("text/plain", "demo.txt"); } }
2. 额外注意事项
- 无需申请
WRITE_EXTERNAL_STORAGE权限:SAF的权限通过takePersistableUriPermission获取,传统存储权限对SAF操作无作用。 - 确保URI持久化生效:你当前将URI字符串写入文件的保存方式可行,重启APP后需用
Uri.parse(保存的字符串)还原URI。 - 可添加错误判断:
createDirectory()返回null时说明创建失败,可在此处添加异常抛出或错误提示逻辑。
内容的提问来源于stack exchange,提问作者Mayank Kumar Chaudhari
相关产品推荐
相关产品推荐

