La Vista previa para desarrolladores de Android 11 ya está disponible. Pruébala y comparte tus comentarios.

Opciones de configuración

Para configurar cada caso práctico de CameraX, se utiliza una clase de configuración de interfaz que permite controlar diferentes aspectos de las operaciones del caso práctico.

Por ejemplo, con el caso práctico de captura de imagen, puedes definir qué lente se usará, una relación de aspecto objetivo y la manera en que se debe realizar el subproceso. El siguiente código muestra un ejemplo:

Kotlin

    val config = ImageCaptureConfig.Builder()
        .setLensFacing(...)
        .setFlashMode(...)
        .setTargetAspectRatio(...)
        .build()
    

Java

    ImageCaptureConfig config =
        new ImageCaptureConfig.Builder()
            .setLensFacing(...)
            .setFlashMode(...)
            .setTargetAspectRatio(...)
            .build();
    

Además de las opciones de configuración, algunos casos prácticos exponen las API para alterar de forma dinámica la configuración después de que se creó el caso práctico. Para obtener información sobre la configuración específica de casos prácticos individuales, consulta Cómo implementar una vista previa, Cómo analizar imágenes y Cómo tomar una foto.

Selección automática

Automáticamente, CameraX proporciona funciones específicas para el dispositivo en el que se ejecuta tu app. Por ejemplo, CameraX determinará automáticamente la mejor resolución, si no especificas una o si la resolución que especificas no es compatible. Todo eso se controla detrás de escena, por lo que no necesitas escribir código específico para cada dispositivo.

El objetivo de CameraX es inicializar correctamente una sesión de cámara. Por lo tanto, CameraX compromete la resolución y las relaciones de aspecto según la capacidad del dispositivo, por los siguientes motivos:

  • El dispositivo no admite la resolución solicitada.
  • El dispositivo tiene problemas de compatibilidad, como dispositivos heredados que requieren ciertas resoluciones para funcionar correctamente.
  • En algunos dispositivos, ciertos formatos solo están disponibles en determinadas relaciones de aspecto.
  • El dispositivo tiene preferencia por un "mod16 más cercano" para JPEG o codificación de video. Consulta SCALER_STREAM_CONFIGURATION_MAP para obtener más información.

Aunque CameraX crea y administra la sesión, siempre debes verificar en el código los tamaños de imagen que se muestran en los resultados del caso práctico y ajustarlos en consecuencia.

Rotación

De manera predeterminada, la rotación se configura para que coincida con la rotación de la pantalla durante la creación del caso práctico. En este caso predeterminado, CameraX produce resultados que permiten que la app pueda lograr fácilmente lo que esperas obtener en la vista previa. Puedes cambiar la rotación a un valor predeterminado para admitir dispositivos de una amplia variedad de pantallas. Para ello, pasa la orientación de la pantalla del momento al configurar el caso práctico o hazlo de manera dinámica cuando ya se haya creado.

Tu app puede configurar la rotación objetivo mediante creadores de configuración. También puedes actualizar la configuración de rotación de tu app con métodos de las API de casos prácticos (por ejemplo, ImageAnalysis.setTargetRotation()), incluso mientras el ciclo de vida se encuentra en estado de ejecución. Esto es posible cuando la app está bloqueada en modo de retrato, por lo que no se produce ninguna reconfiguración de rotación, pero la foto o el caso práctico de análisis requieren que la rotación del dispositivo de ese momento se tenga en cuenta. Por ejemplo, el reconocimiento de rotación puede ser necesario para que los rostros estén orientados correctamente y se puedan detectar, o que las fotos estén configuradas en modo horizontal o vertical.

Si bien los datos de las imágenes capturadas se almacenan sin la rotación, los datos de Exif contienen la información de rotación de manera que las aplicaciones de galería puedan mostrar la imagen con la orientación correcta después de guardarlas.

Para mostrar datos de vista previa con la orientación correcta, puedes usar los resultados de los metadatos de Preview.PreviewOutput() a fin de crear transformaciones para la pantalla GLSurfaceView.

En el siguiente ejemplo de código, puedes ver cómo configurar la rotación mediante las API de configuración:

Kotlin

    val previewConfig = PreviewConfig.Builder()
            .setTargetRotation(windowManager.defaultDisplay.rotation)
            .build()
    

Java

    PreviewConfig previewConfig =
      new PreviewConfig.Builder()
          .setTargetRotation(getWindowManager().getDefaultDisplay().getRotation())
          .build();
    

En función de la rotación, cada caso práctico rotará los datos de la imagen directamente o proporcionará los metadatos de rotación a los usuarios de los datos de la imagen no rotada.

  • Vista previa: La salida de los metadatos se proporciona para crear las transformaciones correctas de una pantalla GLSurfaceView usando Preview.PreviewOutput.getRotationDegrees().
  • Análisis de imágenes: El resultado de los metadatos se proporciona para que se conozcan las coordenadas de búfer de la imagen en relación con las coordenadas de la pantalla. El método analyze() proporciona un parámetro rotationDegrees que representa la rotación que debe aplicarse para que los datos de análisis de la imagen coincidan con el visor.
  • Captura de imágenes: Se modificarán los metadatos de Exif de la imagen para tener en cuenta la configuración de rotación.

Resolución de la cámara

Puedes elegir permitir que CameraX configure la resolución de imagen según una combinación de funciones del dispositivo, el nivel de hardware compatible con el dispositivo, el caso práctico y la relación de aspecto proporcionada. De manera alternativa, puedes configurar una resolución objetivo específica con una relación de aspecto correspondiente en los casos prácticos que admiten esa configuración. Las resoluciones que coincidan con la relación de aspecto objetivo tendrán prioridad sobre la resolución objetivo específica.

Resolución automática

CameraX puede determinar automáticamente la mejor configuración de resolución según los casos prácticos especificados en CameraX.bindToLifecycle(). Siempre que sea posible, especifica todos los casos prácticos necesarios para que se ejecuten en simultáneo en una sola sesión y en una sola llamada de CameraX.bindToLifecycle(). CameraX determinará las resoluciones según el conjunto de casos prácticos vinculados, tendrá en cuenta el nivel de hardware compatible con el dispositivo y considerará la variación específica del dispositivo (en la que un dispositivo puede superar o no alcanzar las configuraciones de transmisión disponibles). El intent sirve para permitir que la aplicación se ejecute en una amplia variedad de dispositivos y, al mismo tiempo, se minimicen las rutas de acceso de código específicas para cada dispositivo.

La relación de aspecto predeterminada para los casos prácticos de análisis de imagen y captura de imagen es 4:3.

Los casos prácticos tienen una relación de aspecto configurable que permiten que la aplicación especifique la relación de aspecto deseada según el diseño de la IU. El resultado de CameraX se producirá para que la relación de aspecto solicitada coincida lo más posible con lo que admite el dispositivo. Si no hubiera una concordancia exacta en la relación admitida, se seleccionará la que cumpla con la mayor cantidad de condiciones posible. Entonces, la aplicación indicará cómo debería aparecer la cámara en la app y CameraX determinará la mejor configuración de resolución de cámara para diferentes dispositivos.

Por ejemplo, una app podría hacer cualquiera de las siguientes tareas:

  • Configurar el diseño a fin de usar 4:3 para la captura de imágenes.
  • Especificar un diseño de pantalla completa. Debido a la variación de resoluciones de pantalla y teniendo en cuenta la barra de IU del sistema, esta relación varía según cada dispositivo.
  • Especificar un diseño cuadrado.

CameraX elegirá las resoluciones de superficie de Camera2 interna automáticamente. En la siguiente tabla, se muestran las resoluciones:

Caso práctico Resolución de superficie interna Resultado de resolución de datos
Vista previa Relación de aspecto: Es la resolución que mejor se ajusta al objetivo de la configuración. Resolución de superficie interna. Se proporcionan los metadatos para permitir una vista a fin de recortar, ajustar y rotar la imagen para la relación de aspecto objetivo.
Resolución predeterminada: Es la resolución de vista previa más alta o la resolución preferida por el dispositivo más alta que coincide con la relación de aspecto de arriba.
Resolución máxima: Es el tamaño de la vista previa, que hace referencia a la mejor coincidencia de tamaño en relación con la resolución de pantalla del dispositivo o a 1080 p (1920 x 1080), el que sea menor.
Análisis de imágenes Relación de aspecto: Es la resolución que mejor se ajusta al objetivo de la configuración. Resolución de superficie interna.
Resolución predeterminada: La configuración de resolución objetivo predeterminada es 640 x 480. Ajustar la resolución objetivo y la relación de aspecto correspondiente resultará en una mejor resolución compatible por debajo de 1080p.
Resolución máxima: CameraX limita este valor a 1080p. De manera predeterminada, la resolución objetivo se configura en 640 x 480; si quieres una resolución superior, debes usar setTargetResolution y setTargetAspectRatio para obtener la resolución más cercana a las compatibles.
Captura de imágenes Relación de aspecto: Es la relación de aspecto que más se ajusta a la configuración. Resolución de superficie interna.
Resolución predeterminada: Es la resolución más alta disponible o la resolución preferida por el dispositivo más alta que coincide con la relación de aspecto de arriba.
Resolución máxima: Es la resolución máxima del dispositivo para el formato JPEG de StreamConfigurationMap#getOutputSizes.

Especifica una resolución

Puedes configurar resoluciones específicas al crear configuraciones de casos prácticos mediante el método setTargetResolution(Size resolution), como se muestra en el código de muestra siguiente:

Kotlin

    val imageAnalysisConfig = ImageAnalysisConfig.Builder()
        .setTargetResolution(Size(1280, 720))
        .build()
    

Java

    ImageAnalysisConfig config =
      new ImageAnalysisConfig.Builder()
        .setTargetResolution(new Size(1280, 720))
        .build();
    

Puedes configurar una relación de aspecto en función de la resolución especificada. La relación de aspecto objetivo afectará la elección de resolución. Configura la relación de aspecto objetivo para que coincida con la resolución y, así, obtener la resolución elegida. La resolución resultante tiene en cuenta la capacidad del dispositivo y otros casos prácticos adjuntos.

Si la resolución exacta y la relación de aspecto solicitadas no se pueden utilizar, se elige la resolución más alta y cercana, y se define en 640 x 480 si no hay ninguna disponible.

CameraX aplicará la mejor resolución adecuada según las solicitudes. Si la principal necesidad es satisfacer la relación de aspecto, especifica setTargetAspectRatio solamente. CameraX determinará una resolución específica adecuada según el dispositivo. Si la necesidad principal de la app es especificar una resolución para que el procesamiento de imágenes sea más eficaz (por ejemplo, una imagen pequeña o mediana según la capacidad de procesamiento del dispositivo), usa setTargetResolution(Size resolution).

Si tu app requiere una resolución exacta, consulta la tabla de createCaptureSession para determinar qué resoluciones máximas son compatibles en cada nivel de hardware. Para ver las resoluciones específicas compatibles con el dispositivo que se está usando, consulta StreamConfigurationMap.getOutputSize(int).

Si tu app se ejecuta en Android 10, puedes usar isSessionConfigurationSupported para verificar una SessionConfiguration específica.

Foco de control

La API CameraControl ofrece capacidades de presionar para enfocar. Para obtener un CameraControl, especifica el objetivo de la lente:

Kotlin

    CameraX.getCameraControl(LensFacing lensFacing)
    

Java

    CameraX.getCameraControl(LensFacing lensFacing);
    

Usa MeteringPointFactory, MeteringPoint, MeteringMode y FocusMeteringAction para ejecutar la capacidad de presionar para enfocar:

Kotlin

    val factory = SensorOrientedMeteringPointFactory(width, height)
    val point = factory.createPoint(x, y)
    val action = FocusMeteringAction.Builder.from(point,
        FocusMeteringAction.MeteringMode.AF_ONLY)
        .addPoint(point2, FocusMeteringAction.MeteringMode.AE_ONLY) // could have many
        .setAutoFocusCallback { }
        // auto calling cancelFocusAndMetering in 5 seconds
        .setAutoCancelDuration(5, TimeUnit.SECONDS)
        .build()
    

Java

    MeteringPointFactory factory = new SensorOrientedMeteringPointFactory(width, height);
    MeteringPoint point = factory.createPoint(x, y);
    FocusMeteringAction action = FocusMeteringAction.Builder.from(point,
                                     MeteringMode.AF_ONLY)
        .addPoint(point2, MeteringMode.AE_ONLY) // could have many
        .setAutoFocusCallback(new OnAutoFocusListener(){
            public void onFocusCompleted(boolean isSuccess) {
            }
        })
        // auto calling cancelFocusAndMetering in 5 seconds
        .setAutoCancelDuration(5, TimeUnit.SECONDS)
        .build();
    

Recursos adicionales

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

Codelab

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

  • App de muestra de CameraX oficial
  • Comunidad de desarrolladores

    Grupo de debate sobre Android CameraX