You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 00:48:02