Измените яркость фонарика, пока работает предварительный просмотр камеры в Android

В Android 13 (API 33) появился новый элемент управления для регулировки яркости фонарика:

public void turnOnTorchWithStrengthLevel ( cameraId, int torchStrength)

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

Но вызов этой функции во время предварительного просмотра рабочей камеры вызывает исключение:android.hardware.camera2.CameraAccessException: CAMERA_IN_USE (4): turnOnTorchWithStrengthLevel:2596: Факел для камеры «0» недоступен из-за существующего пользователя камеры.

Единственный способ использовать простой факел во время предварительного просмотра — настроить построитель запросов на захват с помощью такой опции:builder.set(CaptureRequest.FLASH_MODE, if (isOn) CaptureRequest.FLASH_MODE_TORCH else CaptureRequest.FLASH_MODE_OFF)Но не позволяет изменять яркость фонарика.

У меня есть такой код только для включения/выключения фонарика во время предварительного просмотра камеры. И это работает нормально.

          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
        }
    }

Я попытался реализовать функцию для Android 13 только для изменения уровня яркости следующим образом:

      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")
    }
}

И выдает исключение в вызове turnOnTorchWithStrengthLevel(cameraDevice.id, level) *CameraAccessException: CAMERA_IN_USE (4): turnOnTorchWithStrengthLevel:2596: Факел для камеры "0" недоступен из-за существующего пользователя камеры

Как я могу изменить яркость фонарика, пока работает предварительный просмотр камеры на Android 13 (T)?

1 ответ

Недавно у меня возникла такая же проблема, и до сих пор я не мог найти хорошего решения. У меня есть код, который работает на AN 13, возможно, он может быть полезен вам или кому-то еще:

          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)
            }
        }
    }
}
Другие вопросы по тегам