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