Android Camera2开启相机预览后调用setTorchMode切换闪光灯报错如何解决
错误原因
你的判断完全正确,当相机ID为0的设备已经被你的应用通过openCamera()占用时,CameraManager.setTorchMode()接口无法再操作对应摄像头的闪光灯,该接口仅支持在相机未被任何应用持有的场景下控制手电筒功能,无需更换其他摄像头ID,通过当前预览会话的CaptureRequest配置闪光灯参数即可实现需求。
代码修改方案
1. 替换闪光灯切换逻辑
删除原有switchLight()方法中调用CameraManager控制手电筒的逻辑,改为通过当前预览的CaptureRequest配置闪光灯常亮模式:
@RequiresApi(Build.VERSION_CODES.M) private fun switchLight() { // 相机和预览会话未初始化完成时直接返回,避免空指针 cameraDevice ?: return captureSession ?: return torchSw = !torchSw // 配置闪光灯模式 previewRequestBuilder.set( CaptureRequest.FLASH_MODE, if (torchSw) CaptureRequest.FLASH_MODE_TORCH else CaptureRequest.FLASH_MODE_OFF ) // 更新预览请求使配置生效 captureSession?.setRepeatingRequest(previewRequestBuilder.build(), null, null) Log.i("switchLight","torchSw : ${torchSw}") }
2. 初始化默认闪光灯状态
在createCameraPreviewSession()方法中创建previewRequestBuilder后,添加默认闪光灯关闭的配置,避免初始状态异常:
previewRequestBuilder = cameraDevice!!.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW) // 新增如下行 previewRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF) previewRequestBuilder.addTarget(surface)
可选优化:设备闪光灯可用性校验
如果需要兼容无闪光灯的设备,可以在打开相机前先查询摄像头特性判断是否支持闪光灯:
// 在openCamera方法中,调用openCamera前添加校验 val characteristics = cameraManager.getCameraCharacteristics("0") val hasFlash = characteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE) == true if (!hasFlash) { button_torch.isEnabled = false // 可以加Toast提示用户设备不支持闪光灯 }
效果验证
修改完成后运行应用,点击闪光灯按钮即可在保持摄像头预览正常显示的同时,切换闪光灯开关状态,不会再出现摄像头占用相关的崩溃。
内容的提问来源于stack exchange,提问作者m-mega
相关产品推荐
相关产品推荐

