Как заблокировать фокус в camera2 api, android?

Я пытаюсь заблокировать Фокус после того, как моя пользовательская камера найдет фокус. Сначала режим AF установлен в auto:

builder.set(CaptureRequest.CONTROL_AF_MODE,
                    CaptureRequest.CONTROL_AF_MODE_AUTO);

и после касания предварительного просмотра он находит расстояние фокусировки, и я должен заблокировать AF и AE, используя этот код:

builder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
builder.set(CaptureRequest.CONTROL_AE_LOCK, true);

блокировка AE отлично работает на любых устройствах. Блокировка AF работает на Nexus5 и Nexus 5x. Но что касается Samsung S5 и S6, он продолжает пытаться найти фокус.

каков наилучший способ блокировки фокуса?

2 ответов


для того, чтобы заблокировать AF, вы должны позаботиться о запросе AF_TRIGGER только один раз с помощью capture() вместо repeatingRequest() (если он не входит в цикл запроса af и всегда пытается сосредоточиться, но некоторые nexus исправляют это в своем FW, поэтому некоторые устройства как Nexus 5 фокус хорошо даже это не должно)

Итак, правильный порядок будет таким:

  • Set CONTROL_AF_MODE до CONTROL_AF_MODE_AUTO (via session.setRepeatingRequest()) и AF_REGIONS и AE_REGIONS если вы хочу!--28-->

  • подождите, пока вы не убедитесь, что CONTROL_AF_MODE уже находится в авто, проверив totalCaptureRequest С CaptureCallback.

  • установить AF_TRIGGER_START в Строителе вместе с CONTROL_AF_MODE_AUTOно на этот раз вместо того, чтобы использовать session.setRepeatingRequest() использовать session.capture().

  • немедленно после этого установите AF_TRIGGER установить AF_TRIGGER_IDLE (не отменить!) использование снова сессия.setRepeatingRequest ()along with theCONTROL_AF_MODE_AUTO`.

  • подождите, пока он не сфокусируется, вы получите FOCUSED_LOCKED или NOT_FOCUSED_LOCKED.

на PASSIVE_FOCUSED состояние только тогда, когда CONTROL_AF_MODE находится в непрерывном изображении не в авто!

позаботьтесь о том, чтобы быть действительно в режиме автоматической фокусировки перед выполнением триггера.

вы должны всегда использовать session.capture() со всеми триггерами (с CONTROL_AE_PRECAPTURE_TRIGGER тоже), но всегда после этого не забудьте поставить триггеры IDLE (не отменить) в session.repeatingRequest()


вы не можете локализовать фокус на CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE.

вы должны включить режим AF CONTROL_AF_MODE_AUTO ждать вопог FOCUSED_LOCKED состояние во время триггера AF. Вы можете проверить, как работает Android focus machine на Введите описание ссылки здесь