Novedades de productos
Más allá de las funciones individuales: Cómo garantizar combinaciones de funciones con CameraX 1.5
Lectura de 6 min
Las apps de cámara modernas se definen por funciones potentes y superpuestas. Los usuarios esperan grabar videos con HDR impresionante, capturar movimientos fluidos a 60 FPS y obtener imágenes 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 específico realmente admita una combinación determinada? Hasta ahora, habilitar varias funciones solía ser una apuesta. Podías verificar la compatibilidad de funciones individuales, pero combinarlas podía generar un comportamiento indefinido o, peor aún, una sesión de cámara fallida. Esta incertidumbre obliga a los desarrolladores a ser conservadores, lo que impide que los usuarios de dispositivos compatibles accedan a la mejor experiencia posible.
Por ejemplo, muy pocos dispositivos premium admiten de manera confiable HDR y video de 60 FPS de forma simultánea. En consecuencia, la mayoría de las apps evitan habilitar ambos a la vez para evitar una mala experiencia del usuario en la mayoría de los teléfonos.
Para abordar este problema, presentamos Feature Group en CameraX , una nueva API diseñada para eliminar esta incertidumbre. Ahora puedes consultar si se admite una combinación específica de funciones antes de configurar la cámara o, simplemente, indicarle a CameraX tus prioridades y permitir que habilite la combinación mejor admitida para ti.
Para quienes no conocen CameraX
Antes de profundizar en la nueva API de Feature Group, repasemos rápidamente qué es CameraX. CameraX es una biblioteca de compatibilidad de Jetpack creada para que el desarrollo de una app de cámara te resulte más fácil. Proporciona una superficie de API coherente y fácil de usar que funciona en la mayoría de los dispositivos Android, y ofrece compatibilidad con versiones anteriores hasta Android 6.0 (nivel de API 23). Si es la primera vez que usas CameraX, te recomendamos que consultes la documentación oficial y pruebes el codelab para comenzar.
Qué puedes compilar con la API de Feature Group
Ya no necesitas apostar por combinaciones de funciones y puedes ofrecer con confianza las mejores experiencias de cámara posibles, como HDR y video de 60 FPS simultáneos en hardware compatible (p.ej., un Pixel 10 Pro), y evitar errores con elegancia en dispositivos que no admiten la combinación.
Pixel 10 Pro que habilita HDR y 60 FPS de forma simultánea
En un dispositivo más antiguo en el que HDR y 60 FPS no se pueden ejecutar de forma simultánea, solo se habilita HDR, mientras que la opción de 60 FPS está inhabilitada.
Con la API de Feature Group, puedes hacer lo siguiente:
- Compilar IUs dinámicas y más inteligentes: Habilita o inhabilita de forma inteligente la configuración en tu IU según la compatibilidad de hardware en tiempo real. Por ejemplo, si un usuario habilita HDR, puedes atenuar y, luego, inhabilitar la opción de 60 FPS de inmediato si la combinación no es compatible con ese dispositivo.
- Ofrecer un modo "Alta calidad" confiable: Configura la cámara con una lista priorizada de las funciones deseadas. CameraX encuentra y habilita automáticamente la combinación mejor admitida para cualquier dispositivo, lo que garantiza un excelente resultado sin una lógica compleja y específica del dispositivo.
- Evitar fallas en la sesión de la cámara: Si verificas la compatibilidad de antemano, evitas que la cámara intente configurar una combinación no admitida, lo que elimina una fuente común de fallas y ofrece una experiencia del usuario fluida.
Cómo funciona: Los componentes centrales
La nueva API se centra en las adiciones clave a SessionConfig y CameraInfo.
- GroupableFeature: Esta API presenta 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 confiabilidad que proporciona esta API. Estamos trabajando activamente para expandir esta lista y presentaremos compatibilidad con más funciones en versiones futuras.
- Nuevos parámetros 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, ideal para las funciones que un usuario habilita de forma explícita, como activar un interruptor "HDR". Para garantizar una experiencia determinística y coherente, la llamadabindToLifecyclegenerará unaIllegalArgumentExceptionsi no se admite la combinación solicitada, en lugar de ignorar silenciosamente una solicitud de función. Se debe usar la API deCameraInfo#isFeatureGroupSupported(detalles a continuación) para consultar este resultado de antemano.preferredFeatureGroup: Úsalo para las funciones que son deseables, pero opcionales, por ejemplo, cuando deseas implementar un modo "Alta calidad" predeterminado. Proporcionas una lista de las funciones deseadas ordenadas según tus prioridades y CameraX habilita automáticamente la combinación de prioridad más alta que admite el dispositivo.
- CameraInfo#isFeatureGroupSupported(): Este es el método de consulta principal para verificar de forma explícita si se admite un grupo de funciones, adecuado para proporcionar solo opciones de funciones admitidas a los usuarios en la IU de tu app. Le pasas un
SessionConfigy muestra un valor booleano que indica si se admite la combinación. Si deseas vincular unSessionConfigcon funciones obligatorias, primero debes usar esta API para asegurarte de que sea compatible.
Implementación en práctica
Veamos cómo usar estos componentes para crear una mejor experiencia de cámara.
Situación 1: Modo de alta calidad "Best Effort"
Si deseas habilitar las mejores funciones posibles de forma predeterminada, puedes proporcionar una lista priorizada a preferredFeatureGroup. En este ejemplo, le indicamos a CameraX que priorice HDR, luego 60 FPS y, por último, la estabilización de vista previa. CameraX controla la complejidad de verificar todas las combinaciones posibles y elegir la mejor que admite el dispositivo.
Por ejemplo, si un dispositivo puede controlar HDR y 60 FPS juntos, pero no con la estabilización de vista previa, CameraX habilitará los dos primeros y descartará el tercero. De esta manera, obtienes la mejor experiencia posible sin escribir verificaciones complejas y específicas del 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)
}
}
)Para este fragmento de código, CameraX intentará habilitar combinaciones de funciones en el siguiente orden de prioridad y seleccionará la primera que admita por completo el dispositivo:
- HDR + 60 FPS + Estabilización de vista previa
- HDR + 60 FPS
- HDR + Estabilización de vista previa
- HDR
- 60 FPS + Estabilización de vista previa
- 60 FPS
- Estabilización de vista previa
- Ninguna de las funciones anteriores
Situación 2: Cómo compilar una IU reactiva
Para crear una IU que responda a las selecciones del usuario y evite que los usuarios seleccionen una combinación de funciones no admitida, puedes consultar la compatibilidad directamente. La siguiente función verifica qué funciones son incompatibles con las selecciones actuales del usuario, lo que te permite inhabilitar los elementos de la IU 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
}Luego, puedes conectar esta lógica a tu ViewModel o controlador de IU para reaccionar a la entrada del usuario y volver a vincular la cámara con una configuración que garantice el funcionamiento.
// 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 en funcionamiento, puedes explorar nuestra app de prueba interna. Proporciona una implementación completa de las situaciones "best effort" y "IU reactiva" que se describieron anteriormente.
Ten en cuenta que esta es una aplicación de prueba y no una muestra admitida oficialmente. Si bien es una excelente referencia para la API de Feature Group, no se ha optimizado para su uso en producción.
Comienza hoy mismo
La API de Feature Group elimina la ambigüedad de trabajar con capacidades avanzadas de la cámara. Si proporcionas una forma determinista de consultar la compatibilidad de funciones, puedes compilar apps de cámara más potentes y confiables con confianza.
La API está disponible como experimental en CameraX 1.5 y está programada para volverse completamente estable en la versión 1.6, con más compatibilidad y mejoras durante el trayecto.
Para obtener más información, consulta la documentación oficial. Estamos ansiosos por ver lo que creas y esperamos tus comentarios. Comparte tus opiniones y reporta cualquier problema a través de los siguientes canales:
Seguir leyendo
-
Novedades de productos
En Google I/O 2026, presentamos el cambio de Android de un sistema operativo a un sistema de inteligencia. También mostramos cómo puedes compilar experiencias inteligentes de forma nativa con el sistema y llevar la potencia de la IA de Google a tus apps.
Jingyu Shi • Lectura de 2 min
-
Novedades de productos
Nos complace anunciar que llegó la compatibilidad oficial con Unreal Engine y Godot para Android XR. También lanzamos nuevas herramientas diseñadas para aumentar tu productividad y habilitar nuevas capacidades de XR: Android XR Engine Hub y Android XR Interaction Framework.
Luke Hopkins, Ryan Bartley • Lectura de 4 min
-
Novedades de productos
Con el lanzamiento de Android 17, estamos haciendo la transición a un estándar de desarrollo adaptable primero. Tus usuarios ya no dependen de un solo factor de forma; cambian entre teléfonos, plegables, tablets, laptops, pantallas automotrices y entornos de XR envolventes durante todo el día.
Fahd Imtiaz • Lectura de 4 min
Mantente al día
Recibe la información más reciente sobre el desarrollo de Android en tu bandeja de entrada todas las semanas.