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

Android 13相机预览时如何调节手电筒亮度?

Android 13相机预览时调节手电筒亮度的解决方案

当相机处于预览会话(CaptureSession)运行状态时,直接调用CameraManager.turnOnTorchWithStrengthLevel会抛出CAMERA_IN_USE异常——原因是相机资源已被预览会话占用。Android 13(API 33)针对预览场景提供了适配的调节方式:通过CaptureRequest.FLASH_STRENGTH参数在预览请求中设置手电筒亮度,无需使用CameraManager的独立torch控制方法。

具体实现步骤

  1. 预先检查设备支持性
    不是所有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]
  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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 19:15:48