Camera2 api не может выключить режим torch

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

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)

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

Itamar Kerbel 26.10.2018 09:53
4
1
1 052
1

Ответы 1

Я нашел ответ, как это исправить, но пока не знаю, зачем это нужно. Я обновил метод, включив следующий блок перед оператором 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 говорит, что вызов более чем одного из них подряд отменяет первый.

Другие вопросы по теме