人脸识别超时时间格式崩溃修复记录
- 日期:2026-09-29
- 项目:AIDishRecognition
- 最终状态:
DONE_WITH_CONCERNS - 状态说明:兼容超时时间的中文、英文及纯数字格式,单元测试和 Debug 构建通过;未在目标设备安装 APK 并执行真实人脸识别流程,因此真机回归仍待人工验收。
问题现象
设置页将人脸识别超时时间保存为 5秒 或 10秒。原人脸识别弹框只移除英文后缀 s,随后直接调用 Integer.parseInt,导致已保存中文格式的设备在摄像头预览成功、启动倒计时时抛出 NumberFormatException。
根因
同一个偏好键 setting_face_recognition_time 存在多种历史格式:纯数字、英文 s 后缀和中文“秒”后缀。两个识别入口分别实现解析,其中 FaceRecognitionPop 未兼容中文格式,也没有非法值回退。
实现摘要
- 新增
FaceRecognitionTimeoutPolicy,职责限定为解析和规范化人脸识别超时时间,不负责偏好读取或计时调度。 - 兼容纯数字、英文
s和中文“秒”,并自动清理首尾空白。 - 配置值为空、非法、溢出或非正数时,先使用调用方默认值;默认值也非法时使用命名的安全默认值。
FaceRecognitionPop和FaceRecognitionDialogFragment统一使用该策略,避免两个入口继续维护不同的解析逻辑。- 保留已有偏好数据,无需用户清除应用数据或重新设置。
业务仓变更文件
app/src/main/java/com/cpt/aidishrecognition/utils/FaceRecognitionTimeoutPolicy.javaapp/src/main/java/com/cpt/aidishrecognition/view/FaceRecognitionPop.javaapp/src/main/java/com/cpt/aidishrecognition/payment/FaceRecognitionDialogFragment.javaapp/src/test/java/com/cpt/aidishrecognition/utils/FaceRecognitionTimeoutPolicyTest.java
测试与验证
TDD 过程
- 先新增回归测试并单独运行。
- 首次运行因
FaceRecognitionTimeoutPolicy尚不存在而编译失败,确认测试处于红灯状态。 - 实现兼容解析并接入两个识别入口后,同一测试转为通过。
最终自动化验证
./gradlew :app:testDebugUnitTest --tests com.cpt.aidishrecognition.utils.FaceRecognitionTimeoutPolicyTest:退出码 0,BUILD SUCCESSFUL in 1s;覆盖纯数字、s、中文“秒”、首尾空白、空值、非法值、非正数以及毫秒转换。./gradlew :app:testDebugUnitTest :app:assembleDebug:退出码 0,BUILD SUCCESSFUL in 3s。git diff --check:退出码 0,无输出。
真机验收建议
- 将超时时间分别切换为“5秒”和“10秒”,进入人脸识别流程,确认预览启动后不再闪退。
- 等待对应时长,确认超时回调仍按 5 秒或 10 秒触发。
- 使用保留旧偏好数据的升级安装方式验证,确认无需清除应用数据。
文档归档检查
- 本记录仅保存在提示词工程
work_android/AIDishRecognition/change_records/。 - Markdown 与 HTML 使用相同 basename 并保持内容一致。
- 业务代码仓未新增
docs/、doc/、prompt/或其他文档产物目录。
Git 操作
未执行 stage、commit、push、branch、merge、rebase、reset 或 clean。