Android 13相机预览时如何调节手电筒亮度?
Android 13相机预览时调节手电筒亮度的解决方案
当相机处于预览会话(CaptureSession)运行状态时,直接调用CameraManager.turnOnTorchWithStrengthLevel会抛出CAMERA_IN_USE异常——原因是相机资源已被预览会话占用。Android 13(API 33)针对预览场景提供了适配的调节方式:通过CaptureRequest.FLASH_STRENGTH参数在预览请求中设置手电筒亮度,无需使用CameraManager的独立torch控制方法。
具体实现步骤
- 预先检查设备支持性
不是所有Android 13设备都支持可调手电筒强度,需先通过相机特性判断:
// 在相机初始化阶段获取对应设备特性 val characteristics = cameraManager.getCameraCharacteristics(cameraDevice.id) val strengthRange = characteristics.get(CameraCharacteristics.FLASH_INFO_STRENGTH_RANGE) // 判断是否支持可变强度:范围存在且最小值≠最大值 val supportsVariableTorch = strengthRange != null && strengthRange.size == 2 && strengthRange[0] != strengthRange[1]
- 修改亮度调节方法
直接在CaptureRequest.Builder中设置亮度参数,更新预览会话即可:
override fun setTorchStrengthLevel(level: Int) { Log.d("qaz", "setTorchStrengthLevel: $level") if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { if (cameraOpened.get()) { val session = captureSession val builderAndHandler = captureRequestBuilderWithHandler if (session != null && builderAndHandler != null) { val (builder, handler) = builderAndHandler // 获取设备支持的亮度范围,将输入值限制在合法区间内 val characteristics = cameraManager.getCameraCharacteristics(cameraDevice.id) val strengthRange = characteristics.get(CameraCharacteristics.FLASH_INFO_STRENGTH_RANGE) ?: return val validLevel = level.coerceIn(strengthRange[0], strengthRange[1]) session.stopRepeating() // 设置手电筒亮度强度 builder.set(CaptureRequest.FLASH_STRENGTH, validLevel) // 保持闪光灯模式为TORCH以维持手电筒开启状态 builder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_TORCH) session.setRepeatingRequest(builder.build(), null, handler) } else { Log.w("qaz", "skip setTorch, because session or builderAndHandler are null") } } else { Log.w("qaz", "skip setTorch, because camera is not opened") } } else { throw IllegalAccessException("This function should be called only on Android T or higher") } }
关键说明
FLASH_STRENGTH的合法取值范围由CameraCharacteristics.FLASH_INFO_STRENGTH_RANGE定义,通常是0到某一最大值(如1024),必须将输入值限制在此区间内,避免参数非法。- 此方法与你已实现的
switchTorch逻辑兼容:开启手电筒时设置FLASH_MODE_TORCH,调节亮度仅更新FLASH_STRENGTH;关闭手电筒时设置FLASH_MODE_OFF即可。
内容的提问来源于stack exchange,提问作者Alexei Maiyorov
相关产品推荐
相关产品推荐

