# 16 原生桥、系统保存与只读分享 听文视频工作台 · 技术架构与实现 · 1.0.2 图示:读取已有成品 → 多层校验 → 用户选择目标 读取已有成品 → 多层校验 → 用户选择目标 保存 分享 用户点保存/分享 任务或作品页 原生桥解析URL或路径 当前本机源 · 固定媒体路由 Python文件白名单 任务媒体/导出记录 · 非空非pending Java再次canonical校验 允许目录/类型/文件 ACTION_CREATE_DOCUMENT 64KiB复制到用户所选URI ACTION_SEND+content URI 随机映射 · 只读grant · Provider复核 图6|安全导出链。保存是复制到用户URI;分享是通过只读内容URI授予目标应用访问,不开放任意私有文件。小屏可横向滚动查看图示 ## NativeBridge接口 方法 | 正式版用途 | 试用附加情况 | saveDraft(json) | Python persist_draft,boolean返回 | 仍受累计计数,不能绕过额度 | exportUrl(url,share) | 将允许媒体URL解析成安全文件,保存或分享 | 到期也可导出已有成品 | exportPath(path) | 路径导出,先Python再Java检查 | 相同 | openLibrary() | 打开作品列表 | 相同 | appInfo() | 返回platform/sdk/真实APK version | 返回1.0.2-trial | trialUpgradeShown() | 不提供 | 读取首次成片购买提示标记 | showTrialUpgrade(completed) | 不提供 | true首次成片提示,false实际到期 | copyWechat() | 不提供 | 复制wzqy2019 | finishAfterDraft() | 不提供这一试用专属配合方法 | 保存队列成功完成后才后退/finish | 桥没有任意shell执行入口,其安全依赖主WebView只加载可信本机内容,并在导出时再次限制来源和路径。不能仅凭桥方法的@JavascriptInterface就认为任何远端页面都可获得相同能力。 ## 多层导出校验 - URL必须当前本机源,只识别日志导出、任务媒体、图库图和已归档MP4的固定路由结构。 - Python checked_export解析文件路径,只允许root/jobs或root/records内现有非空文件,拒绝链接、未完成文件和其他扩展。 - resolve_export_path再检查任务三级路径:audio.mp3必须ready,MP4经archive_video_path,图必须当前image_paths或允许cover;records只能tingwen-records.json。不能通过桥导出job.json、任意私有文件或partial语音片段。 - Java ExportPolicy再次canonical路径验证,确认目录范围、类型和非空。 - 保存发ACTION_CREATE_DOCUMENT,按64KiB块向用户URI复制;取消选择不删除原文件,保存中保留pendingExport状态。 - 分享生成随机token,私有SharedPreferences保存安全路径映射,发content URI并授予只读权限/ClipData;Provider每次访问复核路径,只允许r模式,无增删改。 分享token映射代码中没有固定时间过期或回收器,故不能承诺“数分钟后自动失效”;系统URI读取授权与文件仍存在/合法共同决定能否读取。 Android系统文件选择和文档创建属于SAF机制;Android SAF文档解释通过系统选择器访问用户选定文件。项目实际导入还会按API版本优先系统照片选择器,且无需Manifest中的全盘存储权限。 归档视频接口和任务media/video条件不同:任务media/video只在done可用,/api/videos//media?filename=...按实际成片文件校验,可以在换图后访问保留旧MP4。兼容reveal接口在Android返回android_export_path或android_library,再由移动JS转换为保存/作品页,而不是启动Finder。 依据:MainActivity.java:277–360、ExportPolicy.java:29–47、ExportProvider.java:15–59、android_runtime.py:23–34,207–269、app.py:530–581,820–861。 --- 招商合作微信:wzqy2019。添加备注:听文合作。 原网页:https://tingwen-creator-studio-102.pages.dev/guide/technical-16