In Android 13 (API 33) a new control is appeared to adjust torch brightness:
public void turnOnTorchWithStrengthLevel ( cameraId, int torchStrength)
But invoking this function during a working camera preview raises an Exception: android.hardware.camera2.CameraAccessException: CAMERA_IN_USE (4): turnOnTorchWithStrengthLevel:2596: Torch for camera “0” is not available due to an existing camera user
The only way to use simple torch during preview is to adjust capture request builder with option like so:
builder.set(CaptureRequest.FLASH_MODE, if (isOn) CaptureRequest.FLASH_MODE_TORCH else CaptureRequest.FLASH_MODE_OFF)
But it doesn't allow to modify flashlight brightness.
I have such kind of code just to switch ON/OFF torch during camera preview. And it's working fine.
override fun switchTorch(isOn: Boolean) {
if (cameraOpened.get()) {
val session = captureSession
val builderAndHandler = captureRequestBuilderWithHandler
if (session != null && builderAndHandler != null) {
val (builder, handler) = builderAndHandler
session.stopRepeating()
isTorchInProgress = isOn
builder.set(CaptureRequest.FLASH_MODE, if (isOn) CaptureRequest.FLASH_MODE_TORCH else CaptureRequest.FLASH_MODE_OFF)
session.setRepeatingRequest(builder.build(), null, handler)
}
} else {
postponedSwitchTorch = isOn
}
}
I tried to implement a function for Android 13 only to modify brightness level like so:
override fun setTorchStrengthLevel(level: Int) {
Log.d("qaz", "Api2. 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
session.stopRepeating()
cameraManager.turnOnTorchWithStrengthLevel(cameraDevice.id, level)
builder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_TORCH)
session.setRepeatingRequest(builder.build(), null, handler)
} else {
Log.w("qaz", "skip setTorch, because session or buildANdHandler 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")
}
}
And it throws an exception in call turnOnTorchWithStrengthLevel(cameraDevice.id, level) *CameraAccessException: CAMERA_IN_USE (4): turnOnTorchWithStrengthLevel:2596: Torch for camera "0" is not available due to an existing camera user
How I can change torch brightness while camera preview is working on Android 13 (T)?