2

In Android 13 (API 33) a new control is appeared to adjust torch brightness:

public void turnOnTorchWithStrengthLevel ( cameraId, int torchStrength)

https://developer.android.com/reference/android/hardware/camera2/CameraManager#turnOnTorchWithStrengthLevel(java.lang.String,%20int)

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)?

1 Answers1

0

I had the same issue recently and couldn't find a good solution until now. This is the code I have that works on AN 13, maybe it can be helpful to you or someone else:

    private fun startTorch(cameraId: String) {
    cameraManager.torchCamera?.let {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU &&
            cameraOptions.containsKey(cameraId)
        ) {
            val characteristics = cameraManager.getCameraCharacteristics(it)
            val supportsMaxLevel = characteristics.get(CameraCharacteristics.FLASH_INFO_STRENGTH_MAXIMUM_LEVEL)
            if (supportsMaxLevel != null && supportsMaxLevel > 1) {
                cameraManager.turnOnTorchWithStrengthLevel(
                    it,
                    cameraOptions[it]!!.flashPower
                )
            } else {
                cameraManager.setTorchMode(it, true)
            }
        }
    }
}
BlitzkriegBlue
  • 101
  • 2
  • 14