设置页双预览占用问题记录

背景

2026-04-04 在“设置 -> 相机设置”中新增了“人脸识别相机设置”模块,目标是:

项目内两套相机链路本身并不相同:

已知现场使用时,菜品识别相机和人脸识别相机不是同一个物理设备。

问题现象

在第一版实现中,进入“设置 -> 相机设置”页面后,会出现:

但在用户确认现场设备后可以排除一个常见误判:

初步排查结论

问题的核心不在“两个设置项选中了同一设备”,而在“设置页初始化时,同时拉起了两套预览链路”:

另外,人脸识别区域第一版为了动态读取可选分辨率,初始化时会尝试直接 Camera.open(cameraId) 获取支持尺寸列表。
这一步虽然只是为了填充分辨率下拉框,但在设置页打开阶段就提前触发了系统相机占用。

也就是说,第一版的冲突来源更接近下面两点:

  1. 页面一进入就自动拉起两套相机管理器
  2. 人脸设置初始化分辨率时还会额外主动打开一次系统相机

验证过程

为确认问题来源,曾临时把人脸预览改成“手动开启”:

验证结果:

这说明问题并不是“页面里放了两块预览 UI 就一定冲突”,而是“初始化阶段对人脸相机资源的抢占方式”有问题。

最终处理

在确认“手动开启时不再占用”后,最终实现调整为:

1. 保留人脸识别预览画面

设置页仍然支持同时看到:

也就是最终仍然支持“自动双预览”。

2. 不再在分辨率初始化时主动 Camera.open(...)

人脸识别分辨率下拉改为非侵入式方案:

这样可以避免“只是为了显示分辨率下拉框,却在页面初始化时抢先占用系统相机”。

3. 自动预览只保留真正需要的启动逻辑

最终恢复为:

但不再恢复第一版里那种“为了探测参数而额外打开相机”的初始化方式。

结论

本次问题的真正原因可以归纳为:

最终结论:

当前结果

当前设置页行为为:

验证

已执行:

./gradlew :app:compileDebugJavaWithJavac

结果:BUILD SUCCESSFUL