使用Android Camera2同时预览双后置摄像头报ERROR_MAX_CAMERAS_IN_USE错误
错误原因
ERROR_MAX_CAMERAS_IN_USE 错误触发有两个核心场景:
- 硬件与系统版本不支持:Android 10(API 29)才首次官方支持多摄像头同时打开,Android 11(API 30)新增了可同时打开的摄像头组合查询接口。大多数中低端机型即便系统版本达标,也仅支持「前置+任意后置」的组合同时打开,不支持两个后置摄像头同时工作。你目前可以正常打开前置+单个后置,符合这类设备的特性。
- 代码逻辑存在缺陷:
- 全局共用
imageDimension变量,打开第二个摄像头时会覆盖第一个摄像头的输出尺寸配置,导致第一个摄像头的预览会话异常占用底层资源,触发上限报错 - 两个摄像头同时触发打开请求,并发操作容易和相机底层调度逻辑冲突,导致第二个摄像头申请资源失败
- 打开摄像头时未指定后台Handler,主线程阻塞可能导致摄像头打开超时,被底层判定为占用
- 全局共用
修复方案
- 先验证设备支持性:API >=30 时通过
CameraManager.getConcurrentCameraIds()查询设备支持的可同时打开的摄像头组合,如果返回的列表中不包含你需要的两个后置ID组合,说明硬件本身不支持该操作,直接提示用户即可。 - 修改全局尺寸变量:把原本的全局
Size imageDimension改成Size[] imageDimensions = new Size[2];,每个摄像头打开时单独存储自己的输出尺寸,不要共用变量。 - 调整为串行打开逻辑:不要同时触发两个摄像头的打开请求,等第一个摄像头的
updatePreview执行完成、预览正常运行之后,再触发第二个摄像头的打开操作。 - 指定摄像头回调的运行线程:把
manager.openCamera方法的第三个参数从null改为对应摄像头的后台HandlermBackgroundHandlers[cameraID],避免主线程阻塞导致的打开异常。
内容的提问来源于stack exchange,提问作者lbusellato
相关产品推荐
相关产品推荐

