fix(mobile): support Android system file picker

This commit is contained in:
key
2026-07-29 23:52:44 +08:00
parent 6a6b264f22
commit 5027bef32d
27 changed files with 680 additions and 130 deletions
+15 -5
View File
@@ -50,6 +50,14 @@ Android 每个人工步骤完成后,可在不改变设备状态的前提下保
2026-07-29 当前非自定义基座内测 APK 已升级为 `0.1.13 (113)`,大小 `33,921,543` 字节,SHA-256 为 `FA2D2A6DC84AE759714E6D16D146C1E1552A0F3F53C046069422012361D1D0C0`。DCloud 云端证书打包成功,APK 深检通过包名、API 35、v2 测试签名、登录页法务门禁、身份失败关闭、包内资源一致性、敏感值和禁止明文 HTTP。干净提交 `af8af2f6` 的统一 RC 已达到 `releaseEligible=true`。生产固定码的首次获取/登录、退出、旧令牌失效、等待防刷窗口后的再次获取和重新登录已在非真机认证脚本中通过,两次验证码请求均确认未真实发送短信;固定码认证不再列为功能缺口,这不替代本文件下列 Android 真机权限、系统选择器、前后台、弱网、附件和媒体链路验收。
同日,`0.1.13 (113)` 已在 vivo V2443A(Android 15/API 35)完成从 `0.1.6` 保留数据覆盖安装、同版本再次覆盖安装和 Launcher 冷启动;两次安装均成功,冷启动约 `1.1s`/`1.2s`,相机、录音、图片和视频权限保持未授权,未发现 Crash/ANR。真机登录页确认协议默认未勾选,“获取验证码”和“登录”都会先显示协议门禁;勾选后继续进入验证码必填校验。《服务协议》和《隐私政策》分别由 vivo 系统浏览器打开线上 `/legal/terms.html` 与 `/legal/privacy.html`,隐私正文显示 2026-07-28 版本。按 Home 后进程保持,重新唤起为 `HOT`、约 `0.2s`,页面恢复且无 Crash/ANR。脱敏截图和统一取证保存在 `output/aug1-rc/android-acceptance/20260729-140453-upgrade-0.1.13-cold-launch/`;登录页只截取不含手机号的下半屏,未保存手机号、验证码或令牌。该证据完成登录法务门禁和前后台基础恢复,不替代真实账号登录、麦克风、WebRTC、系统选择器、真实断网、附件和 ASR/TTS 验收。
同一真机随后使用生产现有在职 APP 主体和固定码完成页面登录;账号、固定码和令牌未进入日志、截图或仓库。`0.1.13` 允许麦克风后,原生按住录音、上传和生产 ASR 已跑通,识别结果进入真实“问”主路径。拒绝麦克风后的文件降级同时暴露两个 App-Plus 缺陷:`uni.chooseFile` 在 App 不受支持,且 Native.js 无法可靠构造并传递 Java `byte[]`。调查包 `0.1.14/0.1.15` 仅用于定位,生成的 APK 已删除,不得分发。
当前源码候选已升级为 `0.1.16 (116)`:Android 非媒体文件通过系统 `ACTION_OPEN_DOCUMENT` 选择,以 `ParcelFileDescriptor + FileChannel.transferFrom` 复制到应用专属外部缓存;页面生命周期会区分系统选择器暂时离开和真实离页,图片/视频改走 App 支持的 `uni.chooseMedia`,麦克风拒绝在启动录音前统一进入降级。vivo 真机使用 HBuilderX 5.22 标准调试基座完成选择器打开、取消、重复打开及选择 `100,542` 字节 WAV;复制后字节数一致,并继续完成 multipart 上传、生产 ASR 和成果投稿草稿整理,识别测试语句后只生成追问草稿,未点击“确认投稿”、未形成正式投稿。当前 206/206 项移动端测试、类型检查、App 发布资源预检和 App-Plus 构建通过。
由于 DCloud 当日免费云打包次数已用尽,`0.1.16` 的最终签名 APK 尚未生成,标准调试基座证据不能冒充签名包验收。最后一个可重复校验的签名包仍是 `0.1.13 (113)`,但它不包含上述系统选择器修复;额度恢复或购买次数后必须重新云打包、深检并在同一真机复跑麦克风拒绝、选择器取消/选择和 ASR。当前结论因此仍为 No-Go。
随后根据企业内部应用的体验决策,`0.1.12 (112)` 取消 DCloud 启动原生确认,法务同意统一放到登录页。新 APK 大小 `33,921,458` 字节,SHA-256 为 `DD24E5F20BC7C064F5059E538A1FAB7518DF46CBAB502F59A3629F0B1B1F5EBB`;包体门禁确认 `prompt=none`、登录页两个 HTTPS 链接和未勾选拦截均已内置。在同一 Android 15/API 35 虚拟机卸载旧包后全新安装,取证结果为原生隐私层 `not-visible`、四项敏感权限未授权、进程与前台 Activity 正常且无 Crash/ANR,证据位于 `output/aug1-rc/android-acceptance/20260729-021418-no-native-privacy-fresh-install-retry/`。当前 AVD 是 `x86_64`,而 APK 只含 `arm64-v8a/armeabi-v7a`;DCloud Weex 跨架构转译实际报 `spinWaitPeer timeout`、`sender is null` 和 IPC timeout,所以原生外壳可见但页面主体空白。该现象不证明产品页面失败,也不能作为页面通过证据;不得为此修改正式 ABI、回退 H5 壳或增加业务兜底。
同一 `mobile-uni` 源码的 H5 构建另在 390×844 Playwright 真浏览器补验:登录页核心表单、登录按钮和协议行均在首屏;协议默认未勾选,点击“获取验证码”或“登录”都显示“请先阅读并勾选同意”,且网络列表无业务请求;勾选后进入手机号必填校验;《服务协议》《隐私政策》分别打开 `https://peilian.njzhmj.top/legal/terms.html` 与 `https://peilian.njzhmj.top/legal/privacy.html`,页面标题和正文可读,控制台 0 错误。截图位于 `output/playwright/aug1-login-consent/`。该证据仅覆盖 Web 页面布局、链接与请求前门禁,不替代 App 运行、认证账号业务、系统录音/媒体权限或弱网验收。
@@ -67,16 +75,18 @@ Android 每个人工步骤完成后,可在不改变设备状态的前提下保
- [x] `0.1.8 (108)` 在同一虚拟机完成保留数据覆盖安装、标准 Launcher 启动和首次隐私弹窗前的后台/前台恢复,未见 FATAL 或 ANR。
- [x] `0.1.10 (110)` 从 `0.1.9` 保留数据覆盖安装并冷启动成功,最新原生隐私弹窗、未授权权限基线和无 FATAL/ANR 状态保持。
- [x] 只读统一取证脚本已通过状态变更命令回归并在虚拟机实跑,可重复保存当前版本、Activity、隐私控件、权限、UI、截图和退出记录。
- [x] 媒体选择取消/真实失败、直通车首次弱网恢复和登录法务门禁状态机已由当前 199/199 个移动端测试覆盖;真实 Android 文件选择器取消与断网恢复仍列为下方人工门禁。
- [x] 媒体选择取消/真实失败、Android 系统选择器生命周期、直通车首次弱网恢复和登录法务门禁状态机已由当前 206/206 个移动端测试覆盖;真实断网恢复仍列为下方人工门禁。
- [x] `0.1.12 (112)` 全新安装后不显示原生隐私确认,四项敏感权限保持未授权且无 Crash/ANR;包内登录协议门禁与统一 RC 自动校验通过。
- [x] `0.1.13 (113)` 在 vivo Android 15 真机完成保留数据升级、同版本覆盖安装、冷启动、登录法务门禁、两个线上法务正文和前后台热恢复;四项敏感权限保持未授权且未见 Crash/ANR。
- [x] 同一真机在签名 `0.1.13` 完成真实页面登录和麦克风允许后的原生录音/生产 ASR;当前 `0.1.16` 源码又在 HBuilderX 标准调试基座完成 Android 系统选择器取消、重复打开、真实 WAV 选择、精确复制、上传、生产 ASR 和无提交草稿整理。
## Android(最低 Android 10 + 一台当前主流机型)
- [ ] 登录页协议默认未勾选;两个法务链接能打开正确正文;未勾选时验证码和登录均不发请求,勾选后才允许继续。
- [ ] 在 Android 设备选择数据库现有有效手机号,点击获取验证码后使用生产固定码登录;不得开启真实短信。首次登录、退出、旧令牌失效及重新获取/登录的非真机链路已通过,本项只剩设备页面操作。
- [ ] 首次录音允许麦克风后,可完成转写;拒绝麦克风后不循环申请,能选择本地音频继续。
- [x] 登录页协议默认未勾选;两个法务链接能打开正确正文;未勾选时验证码和登录均不发请求,勾选后才允许继续。
- [x] 在 Android 设备选择数据库现有有效手机号,点击获取验证码后使用生产固定码登录;未开启真实短信,且未保存手机号、固定码或令牌。
- [ ] 首次录音允许麦克风后,可完成转写;拒绝麦克风后不循环申请,能选择本地音频继续。允许分支已在签名 `0.1.13` 通过;拒绝、取消、重复选择和本地音频 ASR 已在 `0.1.16` 标准调试基座通过,仍须等待 `0.1.16` 签名 APK 后复跑。
- [ ] 原生实时对练可完成麦克风授权、实时转写与远端语音播放;WebRTC/WebView 不可用或断线时明确提示并保留录音对练。
- [ ] 图片、视频、文档和音频可选择并上传;受控附件下载后可打开,不泄露 OSS 地址。
- [ ] 图片、视频、文档和音频可选择并上传;受控附件下载后可打开,不泄露 OSS 地址。当前仅完成 `0.1.16` 调试基座的 Android 音频选择/上传/ASR,图片、视频、文档、受控下载和最终签名包仍待验收。
- [ ] 前后台切换、网络断开/恢复、窄屏和底部手势区无白屏、遮挡或重复提交。
- [ ] 再次安装同版本后,桌面图标、启动图和 Android 导航栏不闪白。