Android开发中如何获取闪光灯的默认与最大强度等级
Android闪光灯强度等级获取实现方案
前置说明
- 闪光灯强度调节的公开标准API从Android 13(API 33,即TIRAMISU版本)开始正式提供,低版本系统无统一公开实现方案,各厂商私有API兼容性极差,不建议适配
- 所有取值逻辑必须先做版本判断、硬件支持判断,避免触发崩溃
核心取值逻辑
你需要通过系统CameraManager服务获取摄像头特征参数,直接读取两个官方定义的int类型字段即可拿到需要的数值:
- 最大闪光灯强度:对应
CameraCharacteristics.FLASH_INFO_STRENGTH_MAXIMUM_LEVEL,直接赋值给SeekBar的max属性 - 默认闪光灯强度:对应
CameraCharacteristics.FLASH_INFO_STRENGTH_DEFAULT_LEVEL,直接赋值给SeekBar的初始progress属性
特殊情况处理:如果读取到的最大强度值为
1,代表当前设备闪光灯仅支持开/关两档,不支持亮度分级调节,直接隐藏强度调节控件即可。
注意:不要硬编码后置摄像头ID为"0",部分多摄、折叠屏设备的带闪光灯后置摄像头ID不一定为0,建议遍历摄像头列表做校验,兼容性更好
可直接复用的代码实现(Kotlin)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { val cameraManager = getSystemService(Context.CAMERA_SERVICE) as CameraManager var backFlashCameraId: String? = null // 遍历查找带闪光灯的后置摄像头 for (cameraId in cameraManager.cameraIdList) { val characteristics = cameraManager.getCameraCharacteristics(cameraId) val hasFlash = characteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE) ?: false val lensFacing = characteristics.get(CameraCharacteristics.LENS_FACING) if (hasFlash && lensFacing == CameraCharacteristics.LENS_FACING_BACK) { backFlashCameraId = cameraId break } } backFlashCameraId?.let { camId -> val cameraChars = cameraManager.getCameraCharacteristics(camId) // 读取两个关键等级值,空值时默认回退到1(全开档位) val maxLevel = cameraChars.get(CameraCharacteristics.FLASH_INFO_STRENGTH_MAXIMUM_LEVEL) ?: 1 val defaultLevel = cameraChars.get(CameraCharacteristics.FLASH_INFO_STRENGTH_DEFAULT_LEVEL) ?: 1 if (maxLevel > 1) { // 设备支持亮度调节,初始化SeekBar flashLevelSeekBar.apply { max = maxLevel progress = defaultLevel } // SeekBar进度回调中直接调用以下方法即可实时调整亮度 // cameraManager.setTorchStrengthLevel(camId, progress) } else { // 不支持调节,隐藏控件 flashLevelSeekBar.visibility = View.GONE } } }
补充注意事项
- 调用
setTorchStrengthLevel调整亮度时,必须确保手电筒已经处于开启状态,否则设置不会生效 - 应用退出、手电筒关闭时,系统会自动将闪光灯亮度重置为默认等级,不需要手动还原
- 不要使用反射调用隐藏接口实现低版本适配,碎片化问题会导致大量机型适配异常
内容的提问来源于stack exchange,提问作者Omar Hemaia
相关产品推荐
相关产品推荐

