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

如何基于tree Uri生成指定目录下尚不存在的唯一DocumentFile Uri

核心错误原因

  • DocumentFile.createFile()的第一个参数要求传入MIME类型,而非带点的文件后缀名,你传入.abc属于非法参数,这是两次实现中createFile始终返回null的根因。
  • 自定义后缀.abc若无专属MIME类型,传入通用二进制类型application/octet-stream即可。

正确实现代码

static Uri getUniqueDocumentUri(Context c, String name, Uri myTreeUri) {
    DocumentFile folder = DocumentFile.fromTreeUri(c, myTreeUri);
    // 先校验文件夹是否合法可访问
    if (folder == null || !folder.isDirectory() || !folder.canWrite()) {
        return null;
    }
    
    String targetFileName = name + ".abc";
    int duplicateCount = 1;
    
    // 循环检查重名文件,直到找到未被使用的文件名
    while (folder.findFile(targetFileName) != null) {
        targetFileName = name + duplicateCount + ".abc";
        duplicateCount++;
    }
    
    // 传入正确的MIME类型创建文件
    DocumentFile newFile = folder.createFile("application/octet-stream", targetFileName);
    return newFile != null ? newFile.getUri() : null;
}

补充说明

  • SAF框架本身不支持直接构造未创建文件的Uri,必须先创建文件才能拿到对应Uri,这和原生File API的逻辑存在差异,你第二个版本的重名校验思路是完全正确的,只需要修正createFile的入参即可。
  • 如果.abc属于特定格式文件(比如文本、音视频等),可以将application/octet-stream替换为对应匹配的MIME类型,提升系统识别度。
  • 调用前请确认已对传入的myTreeUri申请了持久化读写权限,否则即便参数正确,createFile也会返回null。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 13:48:03