Android Camera2 API Flash не работает на устройствах Galaxy

Я использую Android Camera2 API, чтобы делать фотографии для приложения, и я не могу заставить вспышку работать должным образом на большинстве устройств Samsung Galaxy (galaxy s6 edge, galaxy s7, galaxy j7). Я полагаю, что правильно реализовал логику флэш-памяти, потому что приложение Google Camera, которое раньше было в магазине Play Store, также демонстрирует то же поведение. Кроме того, Galaxy S8, кажется, работает со вспышкой довольно хорошо (хотя результаты, безусловно, имеют несовместимое освещение)

Проблема с galaxy j7 заключается в том, что, когда я делаю снимок со вспышкой (либо с заблокированной вспышкой, либо с автоматической вспышкой в ​​сцене, требующей вспышки), вспышка остается включенной в течение длительного времени, предварительный просмотр блокируется, а затем после возможно, 7 секунд изображение займет, и вспышка не является частью изображения.

У меня есть следующий метод обработки флэш-режимов:

private void setAutoFlash(CaptureRequest.Builder requestBuilder)
{
    switch (mFlashState)
    {
        case FLASH_STATE_AUTO:
            requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
            //requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
            break;
        case FLASH_STATE_ON:
            requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
            //requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_SINGLE);
            break;
        case FLASH_STATE_OFF:
            requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
            //requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
            break;
    }
}

Эта флэш-логика вызывается каждый раз, когда требуется CaptureRequest.Builder

3 закомментированные строки - это что-то еще, что я прочитал, и это было предложено, чтобы помочь вспышке работать должным образом для меня, но это, кажется, ничего не делает

У Samsung есть собственный API-интерфейс для камеры ( http://developer.samsung.com/galaxy/camera), но я прочитал, что это просто оболочка для Camera2, и я беспокоюсь, что их API не решит мою проблему.

Дополнительная информация:

  • Я пробовал некоторые приложения камеры из магазина игр, некоторые работы, а другие нет.
  • ZCamera отлично работает со вспышкой, что заставило меня подумать, что они используют API камеры samsungs для работы, но потом я заметил, что сенсорный замер ZCamera не работает на устройствах Samsung, что является еще одной проблемой, с которой я столкнулся при отладке своей реализации Camera2.
  • Flash, кажется, работает нормально, если я придерживаюсь устаревшего Camera API

Любая помощь по выполнению работающей вспышки будет принята с благодарностью

3 ответа

Решение

Поработав над этим несколько раз, я понял несколько вещей. Я упомянул, что ZCamera (из магазина игр) работает со вспышкой, и я думал, что они достигли этого с помощью Samsung SDK. Я проверил приложение, и оно не использует Samsung SDK.

Я также включил Samsung SDK в свое приложение, и это ничего не изменило. Samsung SDK - это просто оболочка для камеры Google 2, так что вы можете добавить некоторые специфические функции Samsung, добавив их в свой проект, чтобы не исправить совместимость Samsung.

В конце концов я понял, что поток сенсорного измерения, который я запрограммировал сам (прикоснуться к фокусировке / затем сфотографировать), работал совсем не так, как моя логика, которая работала, когда мы фотографируем без прикосновения к фокусировке. Обычная логика фотографий была заимствована из примера кода googles camera2 api, и он не работал должным образом.

Хитрость, чтобы заставить вспышку срабатывать на устройствах Samsung (или, по крайней мере, то, что у меня работало), состояла в том, чтобы сначала активировать проверку уровней AE, а когда она сходится, запустить триггер автофокуса. Если вспышка включена, она сработает, чтобы проверить уровни АЭ и сфокусироваться, а затем снова сработает вспышка, чтобы сделать снимок.

На самом деле использование Camera2 API является особенным в устройствах Android. Некоторые методы могут быть не реализованы. Например: это и это. Для других, надлежащие режимы вспышки должны быть установлены в зависимости от других свойств. Этот код работает для меня на большинстве устройств Samsung, которые поддерживают camera2API:

 if (mIsFlashSupported) {
        switch (mFlashMode) {
            case FLASH_MODE_ON:
                requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
                requestBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_SINGLE);
                requestBuilder.set(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest.CONTROL_AWB_MODE_FLUORESCENT);
                break;

            case FLASH_MODE_OFF:
                requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON);
                requestBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF);
                requestBuilder.set(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest.CONTROL_AWB_MODE_DAYLIGHT);
                break;

            case FLASH_MODE_AUTO:
            default:
                requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON_AUTO_FLASH);
                requestBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_SINGLE);
                requestBuilder.set(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest.CONTROL_AWB_MODE_DAYLIGHT);
                break;
        }
    }

Мое приложение делает фотографию каждые 5 секунд. Я (1) выбираю камеру, (2) получаю сеанс и затем с каждым циклом я (3) создаю запрос захвата, в котором я устанавливаю режим Flash и вызываю метод захвата сеанса.

У меня нет проблем с моим Samsung SM-G550T (Android версия 6.01), но у меня были некоторые проблемы с режимом Flash на моем Moto G4 (Android версия 7.0). Я получил оба телефона на Flash, но только с этой настройкой:

CaptureRequest.Builder requestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_SINGLE);

В настоящее время у меня проблема с устройством LG (M210N) (версия Android 7.0). Используя настройки, которые я изложил выше, я получаю устройство для прошивки только один раз. Если я полностью повторно инициализирую камеру (как описано выше), устройство будет мигать снова только один раз.

Если я добавлю CONTROL_AE_MODE_ON_ALWAYS_FLASH установив вышеупомянутый requestBuilder, то LG вообще не мигает. Поэтому мне пришлось убрать этот флаг.

Я перепробовал множество различных дополнительных настроек и комбинаций для настроек, и ни одна из них не устранила эту проблему. Интересно, сколько устройств затронуто этой проблемой.

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