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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 16:42:39