Camera2控制手电筒亮度问题:Camera2Video示例调节强度报错求助
解决Camera2控制手电筒亮度及CAMERA_IN_USE错误问题
错误原因
你遇到的CAMERA_IN_USE异常是因为CameraManager的手电筒接口与Camera2的相机Session不能同时使用:当Camera2已经通过CameraDevice和CaptureSession占用相机资源时,CameraManager无法再获取手电筒的控制权,必须通过Camera2原生接口实现亮度调节。
实现步骤
1. 先验证设备是否支持可调亮度手电筒
不是所有设备都支持调节手电筒强度,需要先通过CameraCharacteristics检查:
val cameraManager = getSystemService(Context.CAMERA_SERVICE) as CameraManager val cameraId = "0" // 替换为你实际使用的相机ID val characteristics = cameraManager.getCameraCharacteristics(cameraId) // 获取手电筒强度范围 val flashStrengthRange = characteristics.get(CameraCharacteristics.FLASH_INFO_STRENGTH_RANGE) val supportsVariableStrength = flashStrengthRange != null && flashStrengthRange[1] > flashStrengthRange[0] if (!supportsVariableStrength) { // 设备不支持调节手电筒亮度,仅能开关 return }
2. 通过Camera2 CaptureRequest调节亮度
在你原本的闪光灯切换逻辑中,添加FLASH_STRENGTH参数设置即可,无需使用CameraManager:
// 创建录制请求时设置手电筒状态和强度 val recordRequest = session.device.createCaptureRequest(CameraDevice.TEMPLATE_RECORD).apply { if (torch) { set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_TORCH) // 设置目标强度,需在flashStrengthRange的[最小值, 最大值]区间内 flashStrengthRange?.let { range -> val desiredStrength = 500 // 示例值,替换为你需要的强度数值 set(CaptureRequest.FLASH_STRENGTH, desiredStrength.coerceIn(range[0], range[1])) } } else { set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF) } } // 更新重复请求,使设置生效 session.setRepeatingRequest(recordRequest.build(), sessionListener, cameraHandler)
关键注意事项
FLASH_STRENGTH的取值范围由设备硬件决定,通常是0到某个整数最大值(比如1024),数值越大亮度越高- 必须在
FLASH_MODE设置为TORCH时,FLASH_STRENGTH参数才会生效 - 若设备不支持可调亮度,强行设置
FLASH_STRENGTH会抛出参数无效异常,因此兼容性检查不可省略
内容的提问来源于stack exchange,提问作者MikkelT
相关产品推荐
相关产品推荐

