如何在AndroidX Camera2视频录制过程中开启闪光灯?
问题原因及解决方案
报错原因
你调用CameraManager.setTorchMode()报摄像头占用的核心原因是:当你已经通过Camera2 API打开对应摄像头、创建了CaptureSession之后,摄像头资源已经被当前应用的会话独占,系统级的手电筒接口仅允许在摄像头未被任何应用占用时调用,因此该调用方式不适用于已启动相机会话的场景。
AndroidX支持情况
原生Camera2 API本身就支持视频录制时控制闪光灯,该能力不依赖额外的AndroidX兼容包支持,只要设备硬件支持闪光灯,即可通过正确的API调用实现。
正确实现方式
视频录制场景的闪光灯控制需要通过视频录制对应的重复捕获请求配置实现,具体步骤如下:
- 先通过
CameraCharacteristics检查当前设备摄像头是否支持闪光灯:
CameraCharacteristics characteristics = camManager.getCameraCharacteristics(cameraId); Boolean hasFlash = characteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE); if (!hasFlash) { // 设备无闪光灯,做兼容处理 return; }
- 配置视频录制的CaptureRequest参数:
在创建视频录制用的重复请求时,直接配置闪光灯参数即可,示例代码如下:
// 创建视频录制模板的请求Builder CaptureRequest.Builder recordRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD); // 开启闪光灯常亮模式 recordRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_TORCH); // 必须开启自动曝光,否则闪光灯配置不会生效 recordRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON); // 绑定预览、视频录制的Surface recordRequestBuilder.addSurface(previewSurface); recordRequestBuilder.addSurface(mediaRecorderSurface); // 启动重复请求,闪光灯会同步开启 captureSession.setRepeatingRequest(recordRequestBuilder.build(), null, backgroundHandler);
- 关闭闪光灯:
需要关闭闪光灯时,重新创建请求Builder,将FLASH_MODE设置为FLASH_MODE_OFF,更新重复请求即可。
注意事项
- 部分低端设备不支持视频录制时开启闪光灯,一定要提前做硬件能力检查,避免崩溃
- 摄像头会话存活期间不要调用
CameraManager.setTorchMode(),会触发资源占用异常 - 切换闪光灯模式时必须更新当前CaptureSession的重复请求,配置才会生效
内容的提问来源于stack exchange,提问作者Callum Osborne
相关产品推荐
相关产品推荐

