返回列表 发新帖

[意见反馈] 建议兼容解析 SAF 授权后 documentId 中的真实路径

[复制链接]

26

主题

597

回帖

1873

积分

高中生

Rank: 4

金币
1117
好评
1
信誉
100

考神MT论坛帅哥MT论坛最佳新人MT论坛新人

发表在  2026-6-20 21:52:41 来自手机  | 显示全部楼层 | 阅读模式  来自 海南
本帖最后由 Chumor 于 2026-6-20 22:56 编辑

背景

MT 使用“添加本地存储”访问 Termux、ZeroTermux 或其他 DocumentsProvider 时,用户会通过系统 SAF 授权目录:

  1. Intent.ACTION_OPEN_DOCUMENT_TREE
复制代码


授权完成后,MT 会拿到系统返回的 tree Uri。根据 Android 官方 API,可以从该 Uri 中读取 documentId:



现象

目前 MT 通过“添加本地存储”授权 Termux / ZeroTermux 的 SAF 目录后,路径显示或识别结果可能类似外置存储根路径:

  1. /storage/XXXX-XXXX/
复制代码


但实际上,部分 DocumentsProvider 在授权后返回的 documentId 本身就是可解析路径。

以 Termux 为例,其 DocumentsProvider 中根目录为:

  1. TermuxConstants.TERMUX_HOME_DIR
复制代码


实际默认路径为:

  1. /data/data/com.termux/files/home
复制代码


源码中 documentId 的生成方式是:

  1. private static String getDocIdForFile(File file) {
  2.     return file.getAbsolutePath();
  3. }
复制代码


并且在 queryRoots() 中:

  1. row.add(Root.COLUMN_ROOT_ID, getDocIdForFile(BASE_DIR));
  2. row.add(Root.COLUMN_DOCUMENT_ID, getDocIdForFile(BASE_DIR));
复制代码


在遍历文件时也会写入:

  1. row.add(Document.COLUMN_DOCUMENT_ID, docId);
复制代码


因此 Termux 返回的 documentId 可能类似:

  1. /data/data/com.termux/files/home
  2. /data/data/com.termux/files/home/xxx
复制代码


MT 在授权后可以通过:

  1. String treeId = DocumentsContract.getTreeDocumentId(uri);
复制代码


或在遍历目录时读取:

  1. DocumentsContract.Document.COLUMN_DOCUMENT_ID
复制代码


拿到这些值,并进一步识别为真实路径。

建议

建议 MT 在用户已完成 SAF 授权后,对以下值做路径识别:

  1. treeDocumentId
  2. documentId
  3. COLUMN_DOCUMENT_ID
复制代码


判断逻辑:

  • 从授权 Uri 或遍历 Cursor 中读取 documentId;
  • 判断其是否为可解析的绝对路径,例如:

    1. /data/data/...
    2. /storage/...
    3. /sdcard/...
    复制代码

  • 如果是,则在 MT 内部记录为对应的路径字符串,并建立 SAF Uri 与该路径的映射;
  • 如果不是,则继续按普通 SAF Uri 处理。


用途

识别后可用于:

  • 路径显示;
  • 收藏 / 书签;
  • 路径跳转;
  • 脚本传参;
  • 路径映射。


实际文件读写仍继续使用 SAF Uri / ContentResolver,不需要绕过 SAF,也不要求直接用 File API 访问该路径。

注意

SAF 标准中 documentId 是 Provider 自定义 ID,并不保证一定是真实路径。

因此建议只在已授权且格式明确可解析时识别,不符合条件的保持原有 SAF 逻辑。

Termux / ZeroTermux 只是示例,其他 DocumentsProvider 如果返回类似可解析路径,也可以按同样方式兼容。

@Bin
回复

使用道具 举报

319

主题

4374

回帖

4万

积分

管理员

Rank: 9Rank: 9Rank: 9

金币
121011
好评
1132
信誉
201

MT论坛元老MT论坛优秀教师2018MT论坛优秀成员

QQ
发表于 2026-6-23 16:02:48 | 显示全部楼层  来自 福建
暂不考虑,另外Termux的DocumentsProvider存在问题,比如不支持重命名,建议直接注入MT的文件提供器功能更完善,并且点击APK信息中的数据目录还会直接跳转到本地存储的虚拟目录
回复

使用道具 举报

26

主题

597

回帖

1873

积分

高中生

Rank: 4

金币
1117
好评
1
信誉
100

考神MT论坛帅哥MT论坛最佳新人MT论坛新人

发表于 2026-6-27 06:17:15 来自手机  | 显示全部楼层  来自 海南
Bin 发表于 4 天前
暂不考虑,另外Termux的DocumentsProvider存在问题,比如不支持重命名,建议直接注入MT的文件提供器功能更完善,并且点击APK信息中的数据目录还会直接跳转到本地存储的虚拟目录

好的
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表