Проблемы со вспышкой API Android Camera2 - PullRequest
0 голосов
/ 07 июля 2019

Я работаю с API camera2, и у меня возникают проблемы с управлением различными режимами вспышки.

Мой код следующий:

private boolean setFlashMode(String flashMode) {
        try {
            switch (flashMode) {
                case "on":
                    captureRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_SINGLE);
                    captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
                    captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
                    break;
                case "off":
                    captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);
                    captureRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
                    break;
                case "auto":
                    captureRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
                    captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
                case "torch":
                    captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);
                    captureRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_TORCH);
                    break;
                default:
                    return false;
            }
            cameraCaptureSession.setRepeatingRequest(
                    captureRequestBuilder.build(), null, null);
            return true;
        } catch (CameraAccessException e) {
            e.printStackTrace();
            return false;
        }
    }

Изменение с torch to off вперед и назад не создает проблем, но если я попытаюсь установить его на on, он не только не будет работать, но и нарушит настройку на torch.

Теперь яЯ прочитал это и понял, что есть разные уровни для управления вспышкой и прочим, но я не мог сосредоточиться на проблеме, так как я впервые работаю с camera2 (ядобавление функциональности к существующему коду) и документация не помогает.

Что я явно не так делаю?

РЕДАКТИРОВАТЬ Так выглядит мой код после @eddy-talvala ответ:

private boolean setFlashMode(String flashMode) {
        try {
            switch (flashMode) {
                case "on":
                    captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
                    break;
                case "off":
                    captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
                    captureRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
                    break;
                case "auto":
                    captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);

                case "torch":
                    captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
                    captureRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_TORCH);
                    break;
                default:
                    return false;
            }
            cameraCaptureSession.setRepeatingRequest(
                    captureRequestBuilder.build(), null, null);
            return true;
        } catch (CameraAccessException e) {
            e.printStackTrace();
            return false;
        }

    }

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

Для того, чтобы быть болееЯсно, что я пытаюсь добиться возможности переключаться между этими режимами:

  • on: вспышка всегда срабатывает, когда я делаю снимок, независимо от условий экспозиции
  • off: вспышка никогда не срабатывает, когда я снимаю
  • auto: в зависимости от условий экспозиции, пусть система выбирает, срабатывает ли вспышка или нет
  • torch: оставляйте вспышку включенной, когда я пользуюсь камерой, даже без съемки

Переключение с torch на off все еще работает, но переключение на другие не работает.auto не срабатывает вспышка в условиях низкой освещенности, и если я переключусь на auto с torch, есть большая вероятность, что вспышка все еще остается, как torch.Более того, переключение на on не приводит к срабатыванию вспышки при съемке.

Мое "демо" приложение представляет собой модифицированную версию плагина камеры для примера проекта Flutter , посколькуя пытаюсь отредактировать плагин, добавив ту нативную функцию, которая мне нужна.Изменено означает, что я добавил код дротика для вызова этих методов и некоторые кнопки в пользовательском интерфейсе для переключения между режимами.Я все еще использую плагин "как есть" при съемке.

1 Ответ

1 голос
/ 09 июля 2019

Для «вкл» вы устанавливаете CONTROL_AE_MODE дважды - пытаетесь ли вы установить его «всегда мигать» или «никогда не мигать»?Прямо сейчас «всегда мигать» выигрывает.

В общем, любой из параметров AE_MODE со FLASH в имени переопределяет FLASH_MODE;если вы установите параметр AUTO_FLASH, ALWAYS_FLASH или REDEYE, то значение, установленное для FLASH_MODE, не имеет значения.Это имеет значение только для AE_MODE_ON и OFF, и в этом случае FLASH_MODE контролирует то, что происходит.

Тем не менее, вы все равно не хотите использовать FLASH_MODE_SINGLE (в котором говорится «запускать флэш-память для этого запроса», поэтому повторяется запрос вродеэто не очень хорошая идея), даже если она на самом деле ничего не сделает.Просто переключите FLASH_MODE между TORCH и OFF.

Также для «off» вы полностью отключаете автоэкспозицию, а не просто выключаете вспышку.Если вы не хотите, чтобы вспышка срабатывала, просто установите AE_MODE на AE_MODE_ON и FLASH_MODE на OFF.

То же самое относится и к режиму "факел".

Непонятно, с какой проблемой вы работаетесталкиваясь с «on» - вы просто говорите, что это не работает, но, надеюсь, что-то из вышеперечисленного разрешит это.

...