Android Camera2 API с шаблоном дизайна State - PullRequest
0 голосов
/ 18 июня 2019

Я работаю 2 месяца с разными проектами Camera2 API.Как вы, возможно, знаете, API-интерфейс Camera2 немного сложен для понимания и поддержки, он требует определенных знаний о многопроцессорности, состояниях и обратных вызовах.Простой пример «просто» фотографирования на примерах Google имеет 1000 строк (https://github.com/googlesamples/android-Camera2Basic/blob/master/Application/src/main/java/com/example/android/camera2basic/Camera2BasicFragment.java).). В Интернете также есть многообещающая реализация, называемая Camera3 https://github.com/QuinnFreedman/Camera3, которая упрощает использование Camera2.

В нескольких статьях и примерах я видел, что основной частью приложений Camera2 является автомат (FSA). FSA в порядке, но, поскольку он становится большим, его трудно понять, поддерживать и расширять. Имхо, решение - этоиспользовать шаблон проектирования «Состояние» (https://en.wikipedia.org/wiki/State_pattern). Существует объект Context, который содержит состояние, а также интерфейс состояния и конкретные состояния (открытие, закрытие, предварительный просмотр, фотосъемка).

Простой эскиз:

CamerContext:

  • поля: содержит устройство, сеанс, характеристику, поверхности, обработчик, блокировку, компоновщики запросов, обратные вызовы (захват, сеанс, устройство)
  • методы: onOpenCamera, onCloseCamera, onCaptureCompleted

CameraState:

  • concrete: OpenState, CloseState, PreviewState, TakingPhotoState

Вопросы:

  1. Кто-нибудь делал шаблон проектирования PoC "State" с помощью camera2 api?Это выполнимо?
  2. Кто-нибудь делал шаблон проектирования состояний с параллельными вычислениями (блокировки, потоки) ?Есть мысли, учебник, есть ли у вас статьи?

1 Ответ

0 голосов
/ 11 июля 2019

Хорошо, я готов ответить на мой вопрос. Я сделал 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 строк пользовательского кода (открыть, настроить, подготовить пакетную передачу, принять серийную съемку, закрыть), и я думаю, что это легко понять / изменить;)

...