直接回答
Android 应用无法读取本地模型时,先确定目标文件属于哪种存储边界,以及权限是通过什么机制授予的。应用内部或应用专属外部目录中的文件由应用生命周期和沙箱管理;用户选择的文档通常通过带有授权的 content URI 访问,该授权可能是临时的、被撤销或受 Provider 限制。记住一个绝对路径并不能证明文件仍在,也不能证明应用有权读取。重试之前应分别检查所有权、URI、授权、存储卷和打开结果。 不要通过为所有错误申请宽泛存储权限来“修复”。Android Storage Access Framework 允许用户选择文档并仅授予对该项目的访问权。应用应使用 ContentResolver 处理返回的 URI,而不是从 URI 字符串拼出文件路径。如果业务要求进程重建后仍能访问,要确认选择器是否返回可持久化授权,并且只有产品流程确实需要时才保存该授权。持久授权也可能被用户撤销,云文档 Provider 也可能暂时不可用。这些应被表达为当前无法访问,不应推断文件内容已损坏。 文件访问错误与内容校验必须分开。Provider 可能在应用读到任何字节之前就拒绝或撤销授权;这与成功读取后发现 MIME 类型通用、文件内容无效或模型格式不支持是不同故障。权限问题应提示用户重新选择或恢复访问;解析或摘要错误则遵循工件校验政策。不要对持续返回 Permission Denied 的 URI 不停重试,也不能在授权和内容检查完成之前把文件复制到活动模型目录。 对于应用自有文件,应确认路径来自当前应用上下文与存储位置、目录存在且卷已挂载。应用内部专属文件一般对其他应用私有,应用卸载时通常会删除;应用专属外部文件可能有不同的可用性和生命周期。迁移、重装、包变更或可移除卷移除后保留的旧路径可能已经失效。要查询当前存储状态,并从当前配置重新计算期望路径,不要假设过去保存的绝对字符串仍然有效。 报错时说明观察到的事实和用户可以做什么。对于授权撤销,可以提示“应用已无法访问所选文档,请重新选择”;如果应用根本没有读取到字节,就不能说“模型已损坏”。如果应用自有文件不存在,应说明模型需要通过已经验证的产品路径恢复(若存在),不可虚构下载入口。如果来源或当前模型身份未知,应提示重新选择或使用有文档的模型管理动作,同时保护原有活动模型和用户数据。 日志只保存安全诊断:应用构建、模型配置身份、存储类别、符合政策时脱敏的 URI 域名、授权状态、卷状态、生命周期阶段和错误类别。不要把含身份信息或访问令牌的完整 URI、文件内容、提示词、账户信息或原始堆栈写入对用户可见的支持包。还应记录权限是在打开前缺失、使用时被撤销,还是成功打开后才发生 I/O 错误;这些状态对应不同恢复路径。
用户撤销了已选文档授权
用户通过系统文件选择器选中模型,随后在设置里撤销访问。应用仍缓存旧 URI,但再次打开时在读取任何模型字节前就失败。
决策
识别 URI 授权失效,提示用户重新选择或使用已支持来源,并保持活动模型不变。
预期结果
应用明确报告访问问题而非文件损坏,也不会索取访问无关文件的广泛权限。
需要收集的证据
只有将以下证据与同一模型文件和测试运行关联起来,结论才可复核:
- 事实卡 ANDROID-PRIVACY-01、COVE-MODEL-02;Android 权限与模型身份事实。
- Android Storage Access Framework、ContentResolver 和应用专属存储文档。
收到完整字节流还不够;最终落盘、完整性、运行时加载和恢复路径也必须验证。
实施流程
- 确认文件归属. 判断目标是应用内部、应用专属外部、可移除卷还是用户选择的文档 URI,并记录每种位置的所有权和生命周期区别。
- 读取前核对授权. 应用文件路径根据当前上下文重新生成并检查目录/卷;URI 文件先确认系统授权并通过 Resolver 打开,不从 URI 猜测磁盘路径。
- 处理授权撤回. 只有选取结果允许且产品需要时才保存持久访问权。授权过期或撤销后提供重新选择,不通过请求全盘文件权限绕过。
- 把访问和内容校验分开. 字节尚未打开时只报告访问错误;成功读取候选内容之后才运行格式、长度、可信摘要和运行时校验。
- 保持活动工件. 候选文件在独立位置读取并校验,只有必要检查通过后才能切换。单纯授权错误不能删除原模型或任何用户数据。
- 验证拒绝与卷状态. 测试选择器取消、临时权过期、持久授权撤销、云端提供器离线、卷移除、更新后旧路径失效及重新选择成功。
让每个阶段的状态都可观察。失败信息应指出阶段、模型、运行时和恢复动作,同时避免记录用户私密内容。
验收标准
- 错误说明观察到的存储边界和访问结果,未读到字节前不声称工件损坏。
- 用户选择文档通过获授权 URI 访问,不猜路径也不申请无关的广泛文件权限。
- 授权失效时提供重选或文档化恢复路径,并保持原活动模型可用。
- 支持诊断会隐藏 URI 凭据、文件内容、提示词、账户信息和私有模型数据。
决策对照表
| 维度 | 选择或证据 | 解读方式 |
|---|---|---|
| URI 授权撤销 | 应用无法重新打开此前选择的文件。 | 请求重新选择或恢复产品支持的访问。 |
| 应用路径缺失 | 预期文件不存在或存储卷不可用。 | 检查当前应用存储/卷并通过已验证渠道恢复。 |
| 内容校验失败 | 字节可读但格式、身份或摘要未通过。 | 拒绝候选并遵循工件修复策略。 |
需要避免的失败模式
- 不得为所有读取错误申请全盘访问,也不得把内容 URI 猜成文件系统路径。
- 未能读取字节之前,不得称模型文件格式错误或摘要不匹配。
还要避免静默回退、版本未固定、缺少取消处理,以及把不同配置的结果混在一起下结论。失败运行也应与成功记录一并保存。
最小复现记录
| 层级 | 记录内容 |
|---|---|
| 设备 | 厂商、型号、芯片、内存档位、操作系统版本 |
| 软件 | 应用版本和 Git 提交号 |
| 模型 | 系列、变体、版本、格式、文件长度、摘要、量化方式 |
| 运行时 | 名称、版本、请求后端及实际后端证据 |
| 工作负载 | 样例版本、输入摘要、提示词摘要、输出策略 |
| 结果 | 完成、失败、取消、回退及保护隐私的诊断信息 |
发布检查表
- ☐ 主要搜索问题已回答,且没有未经支持的数字。
- ☐ 所有模型文件和运行时版本均已固定。
- ☐ 代表性任务和失败处理策略均有说明。
- ☐ 生命周期、取消、清理和回退均已测试。
- ☐ 用户内容与网络边界均有说明。
- ☐ 结论只适用于被记录的配置。
- ☐ 新增测试结果时链接到原始方法或证据。
来源与相关证据
中文部署与排错专题见。奇连 AI 端侧专题。
常见问题
文档 URI 失败时是否应申请所有文件访问?
通常不需要。先检查系统授权并使用文档选择流程。宽泛权限会暴露无关文件,也不能恢复已经撤销或过期的 URI 授权,应让用户主动重新选择。
权限拒绝能证明模型文件损坏吗?
不能。应用未成功读取字节就不知道内容是什么。应说明当前访问受阻,让用户重新选择,然后再执行格式和完整性检查,不要猜测文件内容。
保存下来的文档 URI 是否会永久有效?
不会。授权可能临时、被撤销或因内容提供器离线而不可用。应重新检查授权状态,提供重选或服务恢复方式,而非永久信任旧 URI。