Измените яркость фонарика, пока работает предварительный просмотр камеры в Android
В Android 13 (API 33) появился новый элемент управления для регулировки яркости фонарика:
public void turnOnTorchWithStrengthLevel ( cameraId, int torchStrength)
Но вызов этой функции во время предварительного просмотра рабочей камеры вызывает исключение: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)
}
}
}
}