Расширения поставщика CameraX

Производители устройств могут внедрить OEM-библиотеку OEM-производителей CameraX, чтобы предоставлять эффекты для конкретных устройств сторонним разработчикам через интерфейс расширений CameraX. CameraX определяет интерфейс расширений CameraX для реализованных поставщиком классов, загружаемых во время выполнения. На этой странице описывается, как внедрить библиотеку OEM-поставщика и включить ее на устройствах.

Прежде чем внедрять библиотеку поставщика, убедитесь, что вы понимаете, как работает библиотека поддержки CameraX Jetpack. Чтобы узнать больше о CameraX см обзор CameraX . Для получения более подробной информации о расширениях поставщика см расширения Vendor .

Архитектура

Архитектура

Рисунок 1. Vendor Extensions схема архитектуры

Эта диаграмма описывает архитектуру расширений поставщика CameraX. Сторонние приложения построены с библиотекой расширений CameraX (камеры-расширения) и использовать расширения камеры публичного API (камеры-расширения API). API расширений камеры определяется CameraX и обновляется при выпуске новой версии библиотеки расширений камеры. Версии общедоступного API-интерфейса camera-extensions и библиотеки camera-extensions одинаковы.

Интерфейс расширения (расширения интерфейс) определяется CameraX и позволяет библиотеку камер-расширения для разговора к библиотеке поставщика OEM (камера-расширения-заглушка). Библиотека OEM должна иметь реализацию, соответствующую версии интерфейса расширений. Одна реализация библиотеки расширений камеры может поддерживать несколько версий интерфейса расширений.

Внедрение библиотеки поставщиков OEM

В этих инструкциях по реализации в качестве примера используется расширение поставщика боке (портрет), но вы можете применить их к другим расширениям, таким как расширения HDR, beauty и ночной режим. Чтобы сделать это, скопируйте и вставьте код , используемый для расширения боке и заменить имя расширения с нужным расширением (например, замена BokehImageCaptureExtenderImpl с HdrImageCaptureExtenderImpl ).

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

Проверка версии

При загрузке библиотеки OEM, CameraX проверяет , что библиотека содержит OEM - версию , которая совместима с расширениями интерфейса версии (называется расширение-версия в этом документе). Чтобы определить совместимость версий, CameraX проверяет только основную и дополнительную версии (например, 1.0), но не проверяет версию исправления, поскольку она используется только для исправления ошибок, а не для изменения интерфейса. Требуемая версия расширения для конкретных API указана в этом документе. API без указанной версии расширения совместимы с версией расширения 1.0.

Чтобы проверить версию, CameraX запрашивает ExtensionVersionImpl интерфейс. Затем CameraX использует версию, сообщаемую библиотекой OEM, для определения функциональных возможностей, которые можно вызывать.

Инициализация

CameraX запускает процесс инициализации, когда определяет версию интерфейса расширений, реализованную библиотекой OEM. В InitializerImpl.init метод сигналы библиотеки OEM , что приложение хочет использовать расширение. Никакие другие вызовов в библиотеку OEM (кроме проверки версии) не производится до тех пор , OnExtensionsInitializedCallback не вызываются с состоянием успеха.

Этот метод должен быть реализован начиная с версии расширения 1.1. Для получения дополнительной информации см источник в InitializerImpl .

Интерфейс ExtenderStateListener

CameraX обеспечивает крючки в нескольких местах в своем трубопроводе , чтобы обеспечить библиотеку OEM , чтобы установить соответствующие SessionParameters и CaptureRequest значений. Чтобы библиотека OEM установить эти значения в определенные моменты времени, реализовать ExtenderStateListener интерфейс. Этот интерфейс должен быть реализован как часть любого расширителя, будь то предварительный просмотр, захват изображения, боке или расширитель HDR.

Захват изображения

Для того, чтобы поддержать расширение для захвата изображения , осуществлять соответствующий ImageCaptureExtender интерфейс (например, BokehImageCaptureExtender или HdrImageCaptureExtender ).

ImageCaptureExtender включает в себя интерфейсы , необходимые для расширения , связанного с захватом изображения.

CaptureProcessor интерфейс должен быть реализован для постобработки , чтобы быть сделана в приложении слое. В расширениях интерфейса версии 1.1, только YUV_420_888 формат входного изображения должен быть поддержан. CaptureProcessor интерфейс не требуется , если обработка осуществляется в HAL камеры.

Следующая диаграмма иллюстрирует поток процесса захвата изображения.

Поток процесса захвата изображения

Рисунок - схема последовательности операций захвата 2. Изображение

Пример: BokehImageCaptureExtenderImpl

Для того, чтобы поддержать расширение бока для захвата изображения, осуществлять BokehImageCaptureExtenderImpl класса в androidx.camera.extensions.impl пакета.

Предварительный просмотр

Для того, чтобы поддержать расширение для предварительного просмотра , осуществлять соответствующий PreviewExtender интерфейс (например, BokehPreviewExtender или HdrPreviewExtender ). PreviewExtender интерфейс включает в себя интерфейсы , необходимые для расширения предварительного просмотра связанных.

Для получения дополнительной информации см источник в PreviewExtender .

Обработка изображений для расширения предварительного просмотра может выполняться в HAL камеры или на уровне приложения. Это определяется значением ProcessorType , который возвращается PreviewExtenderImpl .

Если PROCESSOR_TYPE_REQUEST_UPDATE_ONLY тип возвращается, обработка выполняется в HAL через CaptureRequest ключей. Если PROCESSOR_TYPE_IMAGE_PROCESSOR типа возвращаются, обработка выполняется в приложении слоя посредством PreviewImageProcessorImpl интерфейса. Этот интерфейс работает на Image и TotalCaptureResult пары. В расширениях интерфейса версии 1.1, только YUV_420_888 формат входного изображения должен быть поддержан.

На следующей диаграмме показан процесс для расширения поставщика предварительной версии.

Блок-схема предварительного просмотра

Схема последовательности операций Рисунок 3. Предварительный просмотр

Пример: BokehPreviewExtenderImpl

Для поддержки бока для предварительного просмотра, реализовать BokehPreviewExtenderImpl класса в androidx.camera.extensions.impl пакета.

Эталонная реализация

Для реализации библиотеки поставщика эталонного OEM см / платформы / рамки / поддержка / камера / интеграция тесты / extensionstestlib / . Обратите внимание, что эта реализация выполняет сквозные переходы без фактической реализации эффектов.

Настройка библиотеки поставщиков на устройстве

Библиотека OEM-поставщика не встроена в приложение, а загружается с устройства во время выполнения с помощью CameraX. <uses-library> тег объявляет , что androidx.camera.extensions.impl библиотека, которая определяется в AndroidManifest.xml файл, является зависимостью CameraX и должна быть загружена во время выполнения. Это позволяет сторонним приложениям, использующим расширения поставщиков, автоматически пытаться загрузить библиотеку OEM-поставщиков. Библиотека OEM помечена как необязательная, поэтому приложения могут работать на устройствах, на которых нет этой библиотеки.

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

Чтобы настроить OEM-библиотеку на устройстве, выполните следующие действия.

  1. Добавьте разрешение файл, который требуется от <uses-library> тега, используя следующий формат: /etc/permissions/ ANY_FILENAME .xml и /etc/permissions/ ANY_FILENAME .xml . Например, /etc/permissions/camera_extensions.xml . Файлы в этом каталоге обеспечивают отображение библиотеки им в <uses-library> фактического пути к файлу на устройстве.
  2. Используйте приведенный ниже пример, чтобы добавить необходимую информацию в файл.

    • name должно быть androidx.camera.extensions.impl , как это библиотека , которая CameraX выполняет поиск.
    • file абсолютный путь к файлу , который содержит реализацию расширений (например, /system/framework/androidx.camera.extensions.impl.jar ).
    <?xml version="1.0" encoding="utf-8"?>
    <permissions>
        <library name="androidx.camera.extensions.impl"
                 file="OEM_IMPLEMENTED_JAR" />
    </permissions>
    

В Android 12 или выше, устройство , поддерживающее расширения CameraX должно иметь ro.camerax.extensions.enabled набор свойств для true , что позволяет запрашивать ли расширение опор устройств. Для этого добавьте следующую строку в make-файл устройства:

PRODUCT_VENDOR_PROPERTIES += \
    ro.camerax.extensions.enabled=true \

Проверка

Чтобы проверить выполнение библиотеки поставщика OEM на стадии разработки, использовать пример приложение на androidx-main/camera/integration-tests/extensionstestapp/ , которая проходит через различные расширения поставщика.

После завершения реализации, используйте CameraX Vendor Extensions Validation Tool для запуска автоматических и ручных тестов , чтобы убедиться , что библиотека поставщика правильно реализована.

Часто задаваемые вопросы (FAQ)

Есть ли ограничения по уровням API?

да. Это зависит от набора функций Android API, который требуется для реализации библиотеки OEM-поставщика. Например, ExtenderStateListener.onPresetSession() использует SessionConfiguration.setSessionParameters() называют , чтобы установить базовый набор тегов. Этот вызов доступен только на уровне API 28 и выше. Для получения дополнительной информации о конкретных методах интерфейса см ссылочного API документация .