API Camera2 не может отключить режим TORCH - PullRequest
0 голосов
/ 26 октября 2018

У меня есть код для приложения камеры, позволяющий пользователю переключать некоторые параметры вспышки: OFF, ON, TORCH, AUTO и RED_EYE.Когда пользователь меняет режим, у меня появляется следующий оператор switch:

when (flash) {
    Flash.OFF -> {
        builder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON)
        builder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF)
    }
    Flash.ON -> {
        builder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH)
        builder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF)
    }
    Flash.TORCH -> {
        builder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON)
        builder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_TORCH)
    }
    Flash.AUTO -> {
        builder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH)
        builder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF)
    }
    Flash.RED_EYE -> {
        builder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE)
        builder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF)
    }
}

Нажатие на кнопку просто повторяет их, поэтому все работает отлично, пока пользователь не достигнет TORCH.Фонарик включается и все в порядке, затем пользователь нажимает еще раз, чтобы переключиться на AUTO, но свет не гаснет.Только когда пользователь щелкнет достаточное количество раз, чтобы добраться до OFF, свет погаснет.

Я получил это от https://github.com/google/cameraview/blob/master/library/src/main/api21/com/google/android/cameraview/Camera2.java#L544, который, кстати, тоже ломается таким же образом.

Я также создал проблему на https://github.com/google/cameraview/issues/259, чтобы помочь улучшить видимость этой проблемы.

Нужно ли начинать новый сеанс захвата с отключенной вспышкой, прежде чем выключить TORCH?Есть ли лучший способ?

ОБНОВЛЕНИЕ:

Как и предполагалось, я добавил TorchCallback и получил следующие результаты, хотя я не могу понять их.Это происходит, когда я запускаю первый сеанс захвата, и никогда не меняется при переключении режима вспышки.

onTorchModeChanged(0, false)
onTorchModeChanged(0, false)
onTorchModeUnavailable(0)
onTorchModeUnavailable(0)

1 Ответ

0 голосов
/ 26 октября 2018

Я нашел ответ, как это исправить, но пока не знаю, зачем это нужно. Я обновил метод, чтобы включить следующий блок перед оператором switch

if (builder.get(CaptureRequest.FLASH_MODE) == CaptureRequest.FLASH_MODE_TORCH &&
        flash != Flash.TORCH) {
    builder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON)
    builder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF)
    captureSession.capture(builder.build(), null, null)
}

То, что это делает, это отключает режим вспышки, если текущий режим строителя - это факел, а новый режим - нет. Мы запускаем capture, потому что он имеет приоритет над setRepeatingRequest. Кроме того, setRepeatingRequest говорит, что вызов более чем одного из них подряд отменяет первый.

...