Хорошо, я готов ответить на мой вопрос. Я сделал PoC этой идеи. Я пишу какой-то SDK для такой вещи. И я думаю, что это очень полезная библиотека для управления вызовами камеры 2 API. Я не могу поделиться репозиторием, потому что я сделал это для своего работодателя (возможно, он будет доступен в Интернете в последнее время). Но я могу поделиться небольшим знанием.
В качестве основной идеи проекта я использовал шаблон проектирования "State" (https://en.wikipedia.org/wiki/State_pattern),, потому что FSA, разбитый на множество частей, очень трудно поддерживать.
Итак, я создал следующие состояния: ClosedState
, OpenedState
, ConfiguredState
, PreviewState
, PreCapture
, Capture
и CaptureBurst
. И CameraContext
, который является основным классом всего проекта. Все состояния наследуются от AbstractState
.
Closed
и Opened
состояния очень просты. Всего несколько строк кода, очень специфично.
Configured
просто запустите предварительный просмотр.
PreviewState
имеет функцию для последовательности захвата и для захвата одной фотографии (она вызывает session.capture
, session.captureBurst
камеры2 и сеанс.
Capturing
Государства, как следует из названия, несут ответственность за фотографирование (съемка начата, съемка завершена и изображение доступно)
Мои состояния захвата, содержат ссылку на заставку изображения (или заставки изображения для серии) и вызываются во время вызова onimageavailable.
После этой информации время для описания контекста камеры. Как вы знаете из википедии, это клиент для всех звонков. Так что держите много методов:
openCamera, createSession, startPreview, captureStillPic, captureSequence. Но также функции обратного вызова, onCameraOpen, onCameraClose, onImageAvailable, вкл, вкл, вкл. Некоторые из этих методов являются просто мостом для методов, зависящих от состояния (onCameraOpen для CameraContext, мост для onCameraOpen для ClosedState и т. Д.).
Более того, в Camera2Api у нас есть 4 отличительных и очень важных обратных вызова, которые должны быть реализованы: CameraSessionCallback
, CameraStateCallback
, CameraCaptureCallback
и ImageAvailableListener
. Поэтому я создал эквивалентные классы StateAware, которые являются просто мостом для вызовов cameraContext (onCameraOpen
из StateAwareCameraStateCallback
вызовов onCameraOpen
из CameraContext
, что вызывает onCameraOpen
из ClosedState
и т. Д.). Эти обратные вызовы передаются объектам Camera2API.
Кроме того, проекты содержат ImageSavers
для сохранения вывода и FilenameGenerators
для генерации имен файлов. Я также добавил какой-то пакет постобработки. Написание полного PoC с инструментальными тестами и без демонстрационного приложения занимает 1 мм. Тестовый сценарий для получения серийных изображений требует от 100 до 150 строк пользовательского кода (открыть, настроить, подготовить пакетную передачу, принять серийную съемку, закрыть), и я думаю, что это легко понять / изменить;)