Extensiones de proveedores

CameraX proporciona una API para acceder a efectos, como bokeh, HDR y otros, implementados por fabricantes de teléfonos para teléfonos específicos. Para que un dispositivo sea compatible con extensiones de proveedores, debe cumplir con los siguientes requisitos:

  • El efecto debe admitir la biblioteca del OEM del dispositivo.
  • La biblioteca del OEM debe estar instalada en el dispositivo actual.
  • La biblioteca del OEM debe informar que el dispositivo admite la extensión.
  • El dispositivo debe contar con la versión del sistema operativo que requiere la biblioteca.

Puedes habilitar una extensión de manera preferencial: si la extensión es compatible y está instalada en el dispositivo, entonces estará habilitada. De lo contrario, se ajustará de manera óptima para versiones anteriores.

No es necesario que los proveedores proporcionen una implementación para cada efecto y función. Toda función que no tenga una implementación proporcionada por el proveedor se agregará de forma predeterminada a la implementación de CameraX. La implementación predeterminada informa que la función no está disponible y omite la habilitación.

Arquitectura de extensiones

En la siguiente imagen, se muestra la arquitectura de extensiones con CameraX.

Figura 1: Arquitectura de CameraX para extensiones

Las extensiones son independientes del núcleo Camera2 de CameraX. En el diagrama, las flechas rojas indican el flujo de datos principal cuando los usuarios activan una función basada en extensiones, como la captura de imágenes HDR.

Habilita un efecto para la captura de imágenes

Para aplicar extensiones de proveedores a los casos prácticos de CameraX, crea un objeto Extender, que te permitirá configurar Builder con los ajustes para tal efecto o función. Consulta la disponibilidad de la extensión, ya que, si no está disponible, la llamada a enableExtension() no realizará ninguna acción.

Para implementar la extensión en el caso práctico de captura de imágenes, implementa el extensor de captura de imágenes correspondiente, como se muestra en la siguiente muestra de código:

Kotlin

    import androidx.camera.extensions.BokehExtender

    fun onCreate() {
        // Create a Builder same as in normal workflow.
        val builder = ImageCapture.Builder()

        // Create a camera provider
        val cameraProvider : ProcessCameraProvider = ... // Get the provider instance

        // Create an Extender object which can be used to apply extension
        // configurations.
        val bokehImageCapture = BokehImageCaptureExtender.create(builder)

        // Select the camera
        val cameraSelector = CameraSelector.Builder()
                                           .requireLensFacing(CameraX.LensFacing.BACK)
                                           .build()

        // Query if extension is available (optional).
        if (bokehImageCapture.isExtensionAvailable()) {
            // Enable the extension if available.
            bokehImageCapture.enableExtension()
        }

        // Finish constructing configuration with the same flow as when not using
        // extensions.
        val useCase = ImageCapture.Builder().build()
        cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, useCase)
    }
    

Java

    import androidx.camera.extensions.BokehExtender;

    void onCreate() {
        // Create a Builder same as in normal workflow.
        ImageCapture.Builder builder = new ImageCapture.Builder();

        // Create a camera provider
        ProcessCameraProvider cameraProvider = ...; // Get the provider instance

        // Create an Extender object which can be used to apply extension
        // configurations.
        BokehImageCaptureExtender bokehImageCapture = new
                BokehImageCaptureExtender(builder);

        // Select the camera
        CameraSelector cameraSelector = new CameraSelector.Builder().
                                                          .requireLensFacing(CameraX.LensFacing.BACK)
                                                          .build();

        // Query if extension is available (optional).
        if (bokehImageCapture.isExtensionAvailable()) {
            // Enable the extension if available.
            bokehImageCapture.enableExtension();
        }

        // Finish constructing configuration with the same flow as when not using
        // extensions.
        ImageCapture useCase = new ImageCapture.Builder.build();
        cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, useCase);
    }

    

Inhabilita el efecto

Para inhabilitar las extensiones de proveedor, crea una instancia nueva del caso práctico de ImageCapture o de Preview.

Recursos adicionales

Para obtener más información acerca de CameraX, consulta los siguientes recursos adicionales.

Codelab

  • Cómo comenzar a usar CameraX
  • Muestra de código

  • App de muestra de CameraX oficial