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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 20:49:53