Novedades de productos
Más allá de las funciones individuales: garantizar combinaciones de funciones con CameraX 1.5
Lectura de 6 minutos
Las aplicaciones de cámara modernas se definen por funciones potentes que se solapan. Los usuarios quieren grabar vídeos con un HDR impresionante, capturar movimientos fluidos a 60 FPS y obtener grabaciones muy fluidas con la estabilización de vista previa, a menudo todo al mismo tiempo.
Como desarrolladores, sabemos que la realidad es más complicada. ¿Cómo puedes garantizar que un dispositivo concreto sea compatible con una combinación determinada? Hasta ahora, habilitar varias funciones a menudo era una apuesta. Puedes comprobar si se admite una función concreta, pero combinar varias funciones puede provocar un comportamiento indefinido o, lo que es peor, que la sesión de la cámara falle. Esta incertidumbre obliga a los desarrolladores a ser conservadores, lo que impide que los usuarios de dispositivos compatibles disfruten de la mejor experiencia posible.
Por ejemplo, muy pocos dispositivos premium admiten de forma fiable vídeos HDR y de 60 FPS al mismo tiempo. Por lo tanto, la mayoría de las aplicaciones evitan habilitar ambas opciones a la vez para no ofrecer una experiencia de usuario deficiente en la mayoría de los teléfonos.
Para solucionar este problema, presentamos Feature Group en CameraX, una nueva API diseñada para eliminar estas conjeturas. Ahora puedes consultar si se admite una combinación específica de funciones antes de configurar la cámara o simplemente indicar a CameraX tus prioridades y dejar que habilite la combinación mejor admitida.
Para usuarios que no han usado CameraX
Antes de profundizar en la nueva API Feature Group, vamos a repasar rápidamente qué es CameraX. CameraX es una biblioteca de asistencia de Jetpack creada para ayudarte a desarrollar aplicaciones de cámara más fácilmente. Proporciona una superficie de API coherente y fácil de usar que funciona en la mayoría de los dispositivos Android, con compatibilidad con versiones anteriores a Android 6.0 (nivel 23 de la API). Si no has usado CameraX antes, te recomendamos que consultes la documentación oficial y pruebes el codelab para empezar.
Qué puedes crear con la API Feature Group
Ya no tendrás que jugártela con combinaciones de funciones y podrás ofrecer las mejores experiencias de cámara posibles, como vídeo HDR y a 60 FPS simultáneos en hardware compatible (por ejemplo, Pixel 10 Pro), al tiempo que evitas errores en dispositivos que no admiten la combinación.
Pixel 10 Pro con HDR y 60 FPS activados simultáneamente
En un dispositivo antiguo en el que no se pueden ejecutar HDR y 60 FPS simultáneamente, solo se habilita HDR y se inhabilita la opción de 60 FPS.
Con la API Feature Group, puedes hacer lo siguiente:
- Crea interfaces de usuario dinámicas e inteligentes: habilita o inhabilita de forma inteligente los ajustes de tu interfaz de usuario en función de la compatibilidad del hardware en tiempo real. Por ejemplo, si un usuario habilita el HDR, puedes inhabilitar y atenuar al instante la opción de 60 FPS si la combinación no es compatible con ese dispositivo.
- Ofrecer un modo "Alta calidad" fiable: configura la cámara con una lista priorizada de las funciones que quieras. CameraX busca y habilita automáticamente la combinación mejor admitida para cualquier dispositivo, lo que garantiza un resultado excelente sin necesidad de usar una lógica compleja específica para cada dispositivo.
- Evitar fallos en las sesiones de la cámara: al verificar la compatibilidad de antemano, evitas que la cámara intente configurar una combinación no admitida, lo que elimina una fuente habitual de fallos y ofrece una experiencia de usuario fluida.
Cómo funciona: los componentes principales
La nueva API se centra en las adiciones de claves a SessionConfig y CameraInfo.
- GroupableFeature: esta API introduce un conjunto de funciones agrupables predefinidas, como HDR_HLG10, FPS_60, PREVIEW_STABILIZATION y IMAGE_ULTRA_HDR. Debido a las limitaciones computacionales, solo se puede agrupar un conjunto específico de funciones con el alto grado de fiabilidad que proporciona esta API. Estamos trabajando para ampliar esta lista y ofrecer compatibilidad con más funciones en futuras versiones.
- Nuevos parámetros de SessionConfig: esta clase, que se usa para iniciar una sesión de cámara, ahora acepta dos parámetros nuevos:
requiredFeatureGroup: úsalo para las funciones que deben admitirse para que la configuración se realice correctamente. Es ideal para las funciones que un usuario habilita explícitamente, como activar o desactivar un interruptor de "HDR". Para ofrecer una experiencia determinista y coherente, la llamadabindToLifecyclegenerará unIllegalArgumentExceptionsi la combinación solicitada no está disponible, en lugar de ignorar silenciosamente una solicitud de función. La APICameraInfo#isFeatureGroupSupported(con detalles más abajo) se debe usar para consultar este resultado de antemano.preferredFeatureGroup: úsalo para funciones que sean deseables pero opcionales, por ejemplo, cuando quieras implementar un modo "Alta calidad" predeterminado. Proporcionas una lista de las funciones que quieres ordenadas según tus prioridades, y CameraX habilita automáticamente la combinación de mayor prioridad que admita el dispositivo.
- CameraInfo#isFeatureGroupSupported(): es el método de consulta principal para comprobar explícitamente si se admite un grupo de funciones. Es adecuado para ofrecer a los usuarios de la interfaz de tu aplicación solo las opciones de funciones admitidas. Le pasas un
SessionConfigy devuelve un valor booleano que indica si se admite la combinación. Si tienes previsto vincular unSessionConfigcon funciones obligatorias, primero debes usar esta API para asegurarte de que es compatible.
Implementación en la práctica
Veamos cómo usar estos componentes para crear una mejor experiencia de cámara.
Situación 1: modo de alta calidad "Mejor esfuerzo"
Si quieres habilitar las mejores funciones posibles de forma predeterminada, puedes proporcionar una lista priorizada a preferredFeatureGroup. En este ejemplo, le indicamos a CameraX que dé prioridad a HDR, después a 60 FPS y, por último, a la estabilización de la vista previa. CameraX se encarga de la complejidad de comprobar todas las combinaciones posibles y elegir la mejor que admita el dispositivo.
Por ejemplo, si un dispositivo puede gestionar HDR y 60 FPS a la vez, pero no con la estabilización de vista previa, CameraX habilitará los dos primeros y descartará el tercero. De esta forma, obtendrás la mejor experiencia posible sin tener que escribir comprobaciones complejas específicas para cada dispositivo.
cameraProvider.bindToLifecycle( lifecycleOwner, cameraSelector, SessionConfig( useCases = listOf(preview, videoCapture), // The order of features in this list determines their priority. // CameraX will enable the best-supported combination based on these // priorities: HDR_HLG10 > FPS_60 > Preview Stabilization. preferredFeatureGroup = listOf(HDR_HLG10, FPS_60, PREVIEW_STABILIZATION), ).apply { // (Optional) Get a callback with the enabled features // to update your UI. setFeatureSelectionListener { selectedFeatures -> updateUiIndicators(selectedFeatures) } } )
En este fragmento de código, CameraX intentará habilitar combinaciones de funciones en el siguiente orden de prioridad y seleccionará la primera que el dispositivo admita por completo:
- HDR + 60 FPS + Estabilización de vista previa
- HDR + 60 FPS
- Estabilización de vista previa con HDR+
- HDR
- 60 FPS + Estabilización de vista previa
- 60 FPS
- Vista previa de la estabilización
- Ninguna de las funciones anteriores
Situación 2: Crear una interfaz de usuario reactiva
Para crear una interfaz de usuario que responda a las selecciones de los usuarios y les impida seleccionar una combinación de funciones no admitida, puedes consultar la compatibilidad directamente. La función que se muestra a continuación comprueba qué funciones no son compatibles con las selecciones actuales del usuario, lo que le permite inhabilitar los elementos de la interfaz de usuario correspondientes.
/** * Returns a list of features that are NOT supported in combination * with the currently selected features. */ fun getUnsupportedFeatures( currentFeatures: Set<GroupableFeature> ): Set<GroupableFeature> { val unsupportedFeatures = mutableSetOf<GroupableFeature>() val appFeatureOptions = setOf(HDR_HLG10, FPS_60, PREVIEW_STABILIZATION) // Iterate over every available feature option in your app. appFeatureOptions.forEach { featureOption -> // Skip features the user has already selected. if (currentFeatures.contains(featureOption)) return@forEach // Check if adding this new feature is supported. val isSupported = cameraInfo.isFeatureGroupSupported( SessionConfig( useCases = useCases, // Check the new feature on top of existing ones. requiredFeatureGroup = currentFeatures + featureOption ) ) if (!isSupported) { unsupportedFeatures.add(featureOption) } } return unsupportedFeatures }
Después, puedes conectar esta lógica a tu ViewModel o controlador de interfaz de usuario para reaccionar a las entradas del usuario y volver a vincular la cámara con una configuración que funcione.
// Invoked when user turns some feature on/off. fun onFeatureChange(currentFeatures: Set<GroupableFeature>) { // Identify features that are unsupported with the current selection. val unsupportedFeatures = getUnsupportedFeatures(currentFeatures) // Update app UI so that users can't enable them. updateDisabledFeatures(unsupportedFeatures) // Since the UI now only allows selecting supported feature combinations, // `currentFeatures` is always valid. This allows setting // `requiredFeatureGroup` directly, without needing to re-check for // support or set a feature selection listener. cameraProvider.bindToLifecycle( lifecycleOwner, cameraSelector, SessionConfig( useCases = listOf(preview, videoCapture), requiredFeatureGroup = currentFeatures, ) ) }
Para ver estos conceptos en una aplicación funcional, puedes consultar nuestra aplicación de prueba interna. En ella se ofrece una implementación completa de los escenarios de "mejor esfuerzo" y "UI reactiva" que hemos descrito anteriormente.
Nota: Esta es una aplicación de prueba y no un ejemplo admitido oficialmente. Aunque es una referencia excelente para la API Feature Group, no se ha optimizado para su uso en producción.
Empieza hoy mismo
La API Feature Group elimina la ambigüedad de trabajar con funciones avanzadas de la cámara. Al proporcionar una forma determinista de consultar la compatibilidad con las funciones, puedes crear aplicaciones de cámara más potentes y fiables con total confianza.
La API está disponible como experimental en CameraX 1.5 y está previsto que sea totalmente estable en la versión 1.6, con más asistencia y mejoras en camino.
Para obtener más información, consulta la documentación oficial. Estamos deseando ver tus creaciones y esperamos tus comentarios. Envíanos tus comentarios e infórmanos de cualquier problema a través de los siguientes canales:
Seguir leyendo
-
Noticias sobre productos
Nos complace anunciar importantes actualizaciones de nuestros recursos de diseño, que te ofrecen la guía completa que necesitas para crear aplicaciones Android adaptables y de alta calidad en todos los factores de forma. Ahora tenemos una guía sobre la experiencia de escritorio y una galería de diseño de Android renovada.
Ivy Knight • Tiempo de lectura: 2 min
-
Noticias sobre productos
Se ha lanzado la primera versión alfa de Room 3.0. Room 3.0 es una versión principal de la biblioteca que introduce cambios importantes y se centra en Kotlin Multiplatform (KMP). Además, añade compatibilidad con JavaScript y WebAssembly (WASM) a la compatibilidad con Android, iOS y JVM para ordenadores.
Daniel Santiago Rivera • Tiempo de lectura: 4 min
-
Noticias sobre productos
Hoy nos complace compartir cómo estamos incorporando la optimización automática dirigida por comentarios (AutoFDO) al kernel de Android para ofrecer a los usuarios mejoras significativas en el rendimiento.
Yabin Cui • Tiempo de lectura: 4 min
Mantente al día
Recibe cada semana en tu bandeja de entrada las últimas novedades sobre el desarrollo para Android.