Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Extensiones de proveedor de CameraX

Los fabricantes de dispositivos pueden implementar la biblioteca de proveedores OEM de CameraX para exponer los efectos específicos del dispositivo a desarrolladores externos a través de la interfaz de extensiones de CameraX. CameraX define la interfaz de extensiones de CameraX para las clases implementadas por el proveedor cargadas en tiempo de ejecución. Esta página describe cómo implementar la biblioteca de proveedores OEM y habilitarla en los dispositivos.

Antes de implementar la biblioteca de proveedores, asegúrese de comprender cómo funciona la biblioteca de soporte de CameraX Jetpack. Para obtener más información sobre CameraX, ver visión general CameraX . Para obtener más información sobre las extensiones de proveedores, consulte las extensiones del vendedor .

Arquitectura

Arquitectura

Figura 1. Vendor extensiones diagrama de la arquitectura

Este diagrama describe la arquitectura de las extensiones del proveedor de CameraX. Las aplicaciones de terceros se construyen en contra de la biblioteca de extensiones CameraX (cámara-extensions) y utilizan la extensión de la cámara API pública (con cámara extensiones API). CameraX define la API de extensiones de cámara y se actualiza cuando se lanza una nueva versión de la biblioteca de extensiones de cámara. Las versiones de la API pública de extensiones de cámara y la biblioteca de extensiones de cámara son las mismas.

La interfaz de extensiones (extensiones de interfaz) se define por CameraX y permite a la biblioteca con cámara extensiones para hablar, en la biblioteca proveedor OEM (cámara-extensions-talón). La biblioteca OEM debe tener una implementación que coincida con la versión de la interfaz de extensiones. Una única implementación de la biblioteca de extensiones de cámara puede admitir varias versiones de la interfaz de extensiones.

Implementación de la biblioteca de proveedores OEM

Estas instrucciones de implementación utilizan la extensión del proveedor de bokeh (retrato) como ejemplo, pero puede aplicarlas a otras extensiones, como HDR, belleza y modo nocturno. Para ello, copia y pega el código utilizado para la extensión del bokeh y sustituir el nombre de la extensión con la extensión deseada (por ejemplo, la sustitución de BokehImageCaptureExtenderImpl con HdrImageCaptureExtenderImpl ).

No es necesario que proporcione una implementación para cada efecto. Un efecto sin una implementación de proveedor tiene como valor predeterminado la implementación de CameraX. Si un efecto no está disponible, la implementación predeterminada no habilita el efecto e informa al desarrollador externo que el efecto no está disponible.

Verificación de versión

Al cargar la biblioteca OEM, CameraX verifica que la biblioteca OEM contiene una versión que es compatible con las extensiones de interfaz de versión (que se refiere como la extensión-versión en este documento). Para determinar la compatibilidad de la versión, CameraX verifica solo las versiones principales y secundarias (por ejemplo, 1.0), pero no verifica la versión del parche porque se usa solo para corregir errores, no para cambios en la interfaz. La versión de extensión requerida para API específicas se indica en este documento. Las API sin una versión de extensión específica son compatibles con la versión de extensión 1.0.

Para comprobar la versión, CameraX consulta el ExtensionVersionImpl interfaz. Luego, CameraX usa la versión informada por la biblioteca OEM para determinar la funcionalidad a la que se puede llamar.

Inicialización

CameraX inicia el proceso de inicialización cuando ha determinado la versión de la interfaz de extensiones implementada por la biblioteca OEM. Los InitializerImpl.init señales método para la biblioteca de OEM que una aplicación quiere usar extensiones. No hay otras llamadas a la biblioteca OEM (aparte de la comprobación de versión) se realizan hasta OnExtensionsInitializedCallback se llama con un estado de éxito.

Este método debe implementarse a partir de la versión de extensión 1.1. Para más detalles, ver la fuente en InitializerImpl .

Interfaz ExtenderStateListener

CameraX proporciona enlaces en varios lugares en su cartera para permitir la biblioteca OEM conjunto pertinente a SessionParameters y CaptureRequest valores. Para permitir que la biblioteca OEM para establecer estos valores en los tiempos especificados, implementar el ExtenderStateListener interfaz. Esta interfaz debe implementarse como parte de cualquier extensor, ya sea una vista previa, captura de imagen, bokeh o extensor HDR.

Captura de imagen

Para apoyar la extensión para la captura de imagen , aplicar la correspondiente ImageCaptureExtender interfaz (por ejemplo, BokehImageCaptureExtender o HdrImageCaptureExtender ).

ImageCaptureExtender incluye interfaces necesarias para las extensiones relacionadas con la captura de la imagen.

El CaptureProcessor interfaz debe ser implementado para el procesamiento posterior a hacerse en la capa de aplicación. A partir de las extensiones de interfaz de la versión 1.1, sólo el YUV_420_888 formato de imagen de entrada debe ser apoyada. El CaptureProcessor no se requiere interfaz de si el procesamiento se realiza en el HAL cámara.

El siguiente diagrama ilustra el flujo del proceso de captura de imágenes.

Flujo del proceso de captura de imágenes

Figura 2. Imagen diagrama de flujo de captura

Ejemplo: BokehImageCaptureExtenderImpl

Para apoyar la extensión del bokeh para la captura de imágenes, aplicar la BokehImageCaptureExtenderImpl clase en el androidx.camera.extensions.impl paquete.

Avance

Para apoyar la extensión de vista previa , aplicar la correspondiente PreviewExtender interfaz (por ejemplo, BokehPreviewExtender o HdrPreviewExtender ). El PreviewExtender interfaz incluye las interfaces necesarias para las extensiones relacionadas con vista previa.

Para más detalles, ver la fuente en PreviewExtender .

El procesamiento de imágenes para la extensión de vista previa se puede realizar en la HAL de la cámara o en la capa de la aplicación. Esto se determina por el valor de ProcessorType , que se devuelve por PreviewExtenderImpl .

Si el PROCESSOR_TYPE_REQUEST_UPDATE_ONLY se devuelve el tipo, el procesamiento se realiza en el HAL través CaptureRequest llaves. Si el PROCESSOR_TYPE_IMAGE_PROCESSOR se devuelve tipo, el procesamiento se realiza en la capa de aplicación por el PreviewImageProcessorImpl interfaz. Esta interfaz funciona en una Image y TotalCaptureResult par. A partir de las extensiones de interfaz de la versión 1.1, sólo el YUV_420_888 formato de imagen de entrada debe ser apoyada.

El siguiente diagrama ilustra el flujo de proceso para la extensión del proveedor de versión preliminar.

Vista previa del diagrama de flujo

Diagrama de flujo de la Figura 3. Vista previa

Ejemplo: BokehPreviewExtenderImpl

Para apoyar bokeh para la vista previa, implementar el BokehPreviewExtenderImpl clase en el androidx.camera.extensions.impl paquete.

Implementación de referencia

Para una referencia OEM implementación de la biblioteca concesionario, consulte / Plataforma / marcos / Asistencia / cámara / integración-tests / extensionstestlib / . Tenga en cuenta que esta implementación realiza traspasos sin implementar realmente los efectos.

Configuración de la biblioteca de proveedores en un dispositivo

La biblioteca de proveedores OEM no está integrada en una aplicación, sino que CameraX la carga desde el dispositivo en tiempo de ejecución. La <uses-library> tag declara que el androidx.camera.extensions.impl biblioteca, que se define en el AndroidManifest.xml archivo, es una dependencia de CameraX y debe cargarse en tiempo de ejecución. Esto permite que las aplicaciones de terceros que usan extensiones de proveedores intenten cargar automáticamente la biblioteca de proveedores OEM. La biblioteca OEM está marcada como opcional para que las aplicaciones puedan ejecutarse en dispositivos que no tienen la biblioteca en el dispositivo.

CameraX maneja este comportamiento automáticamente cuando una aplicación intenta usar una extensión de proveedor siempre que el fabricante del dispositivo coloque la biblioteca OEM en el dispositivo para que la aplicación pueda descubrirla.

Para configurar la biblioteca OEM en un dispositivo, haga lo siguiente:

  1. Añadir un archivo de autorización, que se requiere por el <uses-library> etiqueta, utilizando el formato siguiente: /etc/permissions/ ANY_FILENAME .xml . Por ejemplo, /etc/permissions/camera_extensions.xml . Los archivos de este directorio proporcionan un mapeo de la biblioteca llamada en <uses-library> a la ruta real del archivo en el dispositivo.
  2. Utilice el siguiente ejemplo para agregar la información necesaria al archivo.

    • name debe ser androidx.camera.extensions.impl ya que es la biblioteca que las búsquedas de CameraX.
    • file es la ruta absoluta del archivo que contiene la implementación extensiones (por ejemplo, /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>
    

En Android 12 o superior, los dispositivos que soportan las extensiones de CameraX deben tener la ro.camerax.extensions.enabled conjunto de propiedades a true , lo que permite la consulta de si un dispositivo admite extensiones. Para hacer esto, agregue la siguiente línea en el archivo de creación del dispositivo:

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

Validación

Para probar la implementación de la librería proveedor OEM durante la etapa de desarrollo, utilizar la aplicación de ejemplo en androidx-main/camera/integration-tests/extensionstestapp/ , que se extiende a través de varias extensiones de proveedores.

Después de completar su aplicación, utilice la herramienta de validación de proveedores CameraX Extensiones para ejecutar pruebas manuales y automatizadas para verificar que la biblioteca proveedor se implementa correctamente.

Preguntas frecuentes (FAQ)

¿Hay alguna restricción en los niveles de API?

Si. Esto depende del conjunto de características de la API de Android que requiere la implementación de la biblioteca del proveedor OEM. Por ejemplo, ExtenderStateListener.onPresetSession() utiliza los SessionConfiguration.setSessionParameters() llama a establecer un conjunto de línea de base de las etiquetas. Esta llamada está disponible solo en el nivel de API 28 y superior. Para más detalles sobre los métodos de interfaz específicas, consulte la documentación de referencia de la API .