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/<id>/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。