2026-04-04 在“设置 -> 相机设置”中新增了“人脸识别相机设置”模块,目标是:
项目内两套相机链路本身并不相同:
CameraUsbUtilsCameraPreviewManager + SingleBaseConfig已知现场使用时,菜品识别相机和人脸识别相机不是同一个物理设备。
在第一版实现中,进入“设置 -> 相机设置”页面后,会出现:
但在用户确认现场设备后可以排除一个常见误判:
问题的核心不在“两个设置项选中了同一设备”,而在“设置页初始化时,同时拉起了两套预览链路”:
CameraUsbUtils 预览另外,人脸识别区域第一版为了动态读取可选分辨率,初始化时会尝试直接 Camera.open(cameraId) 获取支持尺寸列表。
这一步虽然只是为了填充分辨率下拉框,但在设置页打开阶段就提前触发了系统相机占用。
也就是说,第一版的冲突来源更接近下面两点:
为确认问题来源,曾临时把人脸预览改成“手动开启”:
CameraPreviewManager.startPreview(...)Camera.open(...) 探测支持尺寸”的做法验证结果:
这说明问题并不是“页面里放了两块预览 UI 就一定冲突”,而是“初始化阶段对人脸相机资源的抢占方式”有问题。
在确认“手动开启时不再占用”后,最终实现调整为:
设置页仍然支持同时看到:
也就是最终仍然支持“自动双预览”。
Camera.open(...)人脸识别分辨率下拉改为非侵入式方案:
640x4801280x7201920x1080这样可以避免“只是为了显示分辨率下拉框,却在页面初始化时抢先占用系统相机”。
最终恢复为:
但不再恢复第一版里那种“为了探测参数而额外打开相机”的初始化方式。
本次问题的真正原因可以归纳为:
最终结论:
当前设置页行为为:
已执行:
./gradlew :app:compileDebugJavaWithJavac
结果:BUILD SUCCESSFUL