CameraX es una biblioteca de Android Jetpack para trabajar con la cámara, que proporciona una API simple y consistente sobre la compleja Camera2. Abstrae las diferencias entre cientos de modelos de dispositivos Android y garantiza un comportamiento uniforme de la cámara en diferentes dispositivos. Según la Guía de CameraX para desarrolladores de Android (2026), la biblioteca se utiliza en más de 25 000 aplicaciones de Google Play y funciona en dispositivos con API Level 21 y superior.
Puntos clave
CameraX es una biblioteca del conjunto Android Jetpack, lanzada por primera vez por Google en 2019 como reemplazo de la obsoleta Camera API y una alternativa simplificada a la compleja Camera2. La filosofía central de CameraX es “escribe una vez, funciona en todos los dispositivos”. La biblioteca maneja automáticamente las diferencias de hardware: ubicación de las cámaras, resoluciones compatibles, orientación del sensor y formatos disponibles — el desarrollador no necesita escribir código específico del dispositivo.
La arquitectura de CameraX se basa en casos de uso: Preview (mostrar la transmisión de la cámara en Viewfinder), ImageCapture (tomar fotos), ImageAnalysis (analizar el flujo de fotogramas para ML) y VideoCapture (grabar video). Cada caso de uso es un componente independiente que se puede combinar: ejecutar Preview para el visor e ImageAnalysis para procesamiento ML simultáneamente. Según Google (2026), CameraX es compatible con el 99% de los dispositivos Android con API 21+.
CameraX proporciona cambio automático entre cámaras frontal y trasera, soporte para rotación de pantalla sin recrear la sesión, manejo integrado del ciclo de vida mediante LifecycleOwner, vinculación de casos de uso a un único proceso Lifecycle, soporte para Camera2 Extensions para retrato, HDR y modo nocturno, y TestableCameraX para pruebas unitarias sin dispositivo real.
CameraX define cuatro casos de uso estándar, cada uno resolviendo una tarea específica de la cámara. Los casos de uso se pueden combinar: las combinaciones más populares son Preview + ImageCapture para una aplicación de cámara y Preview + ImageAnalysis para un escáner ML.
| Caso de uso | Propósito | Clase |
|---|---|---|
| Preview | Mostrar la transmisión de la cámara en tiempo real | PreviewView |
| ImageCapture | Tomar fotos con configuración de flash y resolución | ImageCapture |
| ImageAnalysis | Analizar cada fotograma para procesamiento ML | ImageAnalysis |
| VideoCapture | Grabar video con micrófono (desde 1.1.0-beta) | VideoCapture |
El caso de uso Preview muestra el flujo de video de la cámara en PreviewView — una Vista especial de la biblioteca CameraX. PreviewView se adapta automáticamente a la relación de aspecto de la cámara, soporta ScaleType (FillCenter, FitCenter) y rotación de pantalla sin recrear el caso de uso. El desarrollador solo necesita vincular Preview a un Lifecycle mediante ProcessCameraProvider.
El caso de uso ImageAnalysis envía cada fotograma de la cámara a un manejador para su análisis: reconocimiento de texto, detección de rostros, escaneo de códigos QR. El analizador recibe fotogramas en formato YUV_420_888 — el espacio de color universal de Android. Modo de operación (BLOCKING o NON_BLOCKING) controla la cola de fotogramas: BLOCKING espera a que finalice el análisis anterior, NON_BLOCKING omite fotogramas durante retrasos.
El caso de uso ImageCapture toma fotos de la cámara con configuración de flash, resolución y compresión. Se admiten formatos JPEG y RAW (en dispositivos compatibles). ImageCapture guarda la foto de forma asíncrona mediante OnImageCapturedCallback o directamente en un archivo mediante ImageCapture.OutputFileOptions.
El caso de uso VideoCapture se añadió en CameraX 1.1.0 (beta) y permite grabar video hasta 4K a 30 FPS. El caso de uso se sincroniza automáticamente con Preview: la imagen en el visor coincide con lo que se está grabando en el archivo. VideoCapture usa MediaCodec y MediaMuxer internamente, ocultando la complejidad de configurar el códec de video y el contenedor MP4.
CameraX y Camera2 son dos enfoques para trabajar con la cámara en Android. Camera2 es una API de bajo nivel que brinda control total sobre el dispositivo. CameraX es una abstracción de alto nivel que automatiza escenarios típicos. La elección entre ellos depende de los requisitos del proyecto.
| Característica | CameraX | Camera2 |
|---|---|---|
| Nivel de API | Alto (caso de uso) | Bajo (control total) |
| Código específico del dispositivo | No requerido | Requerido para cada dispositivo |
| Vinculación al ciclo de vida | Automática | Manual |
| Extensiones | Integradas (HDR, Portrait, Night) | Requieren implementación OEM |
| Complejidad de implementación | 15–30 líneas de código | 100–300 líneas de código |
| Soporte de API | API 21+ | API 21+ |
| Flexibilidad | Escenarios estándar | Cualquier escenario |
Use CameraX para tareas estándar: cámara en la aplicación, escáner QR, procesamiento de flujo ML. Use Camera2 cuando se requiera control manual de exposición, captura RAW con control total de parámetros, o trabajo con múltiples cámaras simultáneamente.
Revisemos una configuración completa de CameraX en una aplicación Android usando los tres casos de uso principales: Preview, ImageCapture e ImageAnalysis.
El código vincula CameraX al ciclo de vida de la Activity mediante ProcessCameraProvider. Primero se solicita una instancia del proveedor, luego se crean los casos de uso y se realiza la vinculación.
val cameraProviderFuture =
ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener({
val cameraProvider = cameraProviderFuture.get()
// Creando Preview
val preview = Preview.Builder()
.build()
.also {
it.setSurfaceProvider(
binding.viewFinder.surfaceProvider
)
}
// Creando ImageCapture
val imageCapture = ImageCapture.Builder()
.setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
.build()
// Vinculando al Lifecycle
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(
this,
CameraSelector.DEFAULT_BACK_CAMERA,
preview,
imageCapture
)
}, ContextCompact.getMainExecutor(this))
El código Kotlin obtiene ProcessCameraProvider mediante un future, crea los casos de uso Preview e ImageCapture, y los vincula al ciclo de vida de la Activity actual. CameraX maneja automáticamente la rotación de pantalla, el cambio de cámara y la liberación de recursos al cerrar la Activity.
Añadamos un caso de uso ImageAnalysis para el procesamiento fotograma a fotograma del flujo de la cámara, por ejemplo para integrarlo con ML Kit.
val imageAnalysis = ImageAnalysis.Builder()
.setBackpressureStrategy(
ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST
)
.build()
imageAnalysis.setAnalyzer(
ContextCompact.getMainExecutor(this)
) { imageProxy ->
// Convirtiendo YUV a Bitmap para ML Kit
val bitmap = ImageUtils.yuvToBitmap(imageProxy)
val inputImage = InputImage.fromBitmap(bitmap)
// Iniciando reconocimiento de texto de ML Kit
recognizer.process(inputImage)
.addOnSuccessListener { result ->
// Procesando el resultado
processTextResult(result)
}
.addOnCompleteListener {
imageProxy.close()
}
}
ImageAnalysis con estrategia KEEP_ONLY_LATEST procesa solo el último fotograma disponible, omitiendo los obsoletos si el analizador no se mantiene al día. Cada fotograma se convierte de YUV a Bitmap para ML Kit, después de lo cual se inicia el reconocimiento de texto. La llamada a imageProxy.close() es obligatoria — de lo contrario CameraX dejará de entregar nuevos fotogramas.
CameraX Extensions es un módulo que añade modos de disparo avanzados: retrato (desenfoque de fondo), HDR (rango dinámico extendido), modo nocturno (disparo con poca luz), retoque automático (corrección de piel) y modo belleza. Las extensiones solo se activan en dispositivos donde el fabricante de la cámara ha proporcionado una implementación OEM.
Antes de usar CameraX Extensions, debe verificar si la extensión está disponible en el dispositivo actual. Google recomienda verificarlo mediante ExtensionsManager.isExtensionAvailable.
val extensionsManager =
ExtensionsManager.getInstance(this)
if (extensionsManager.isExtensionAvailable(
cameraProvider,
CameraSelector.DEFAULT_BACK_CAMERA,
ExtensionMode.BOKEH
)) {
// Activando modo retrato
cameraProvider.bindToLifecycle(
this,
CameraSelector.DEFAULT_BACK_CAMERA,
preview,
imageCapture
)
}
El código verifica la compatibilidad con la extensión BOKEH (retrato) mediante ExtensionsManager y la activa si hay una implementación OEM disponible. CameraX cambia automáticamente la configuración de la cámara para el modo retrato. Si la extensión no está disponible, la aplicación continúa funcionando en modo estándar sin fallos.
CameraX Extensions resuelve uno de los principales problemas del desarrollo Android: la fragmentación de cámaras. En diferentes dispositivos, el modo retrato se implementa de manera diferente — algunos usan lentes duales, otros usan desenfoque por software. CameraX abstrae esta diferencia: el desarrollador activa el modo BOKEH, y la biblioteca misma determina cómo implementarlo en un dispositivo específico. Google mantiene una lista de socios OEM verificados: Samsung, Xiaomi, OPPO, vivo, Google Pixel.
Al trabajar con CameraX, es importante considerar las limitaciones en la cantidad de casos de uso simultáneos: en la mayoría de los dispositivos, se puede ejecutar un máximo de 3 casos de uso a la vez. Por ejemplo, Preview + ImageCapture + ImageAnalysis funciona en todos los dispositivos modernos, pero Preview + ImageCapture + VideoCapture puede no ser compatible en modelos económicos. CameraX proporciona el método ProcessCameraProvider.checkAvailability(), que verifica la compatibilidad de la combinación de casos de uso antes de la vinculación, ayudando a evitar fallos en tiempo de ejecución.
CameraX se integra con Jetpack Navigation mediante CameraXFragment o PreviewView compatible con Compose. Para Compose, se utiliza el elemento AndroidView, en el que se incrusta PreviewView. CameraX maneja correctamente la rotación de pantalla y los cambios de configuración sin perder el estado de la sesión de la cámara — solo especifique el LifecycleOwner, y la biblioteca recreará automáticamente las vinculaciones de casos de uso al rotar el dispositivo.
Para probar CameraX sin un dispositivo real, Google proporciona TestableCameraX — una biblioteca que emula el comportamiento de la cámara en pruebas unitarias. TestableCameraX permite simular fotogramas de la cámara, probar el funcionamiento de ImageAnalysis y la corrección de ImageCapture sin un dispositivo físico. Esto acelera significativamente el pipeline CI/CD para proyectos que trabajan con la cámara.
Preguntas frecuentes
Android 5.0 (API 21) y superior. CameraX cubre el 99% de los dispositivos Android activos. Las extensiones (Portrait, HDR) requieren API 23+ y soporte OEM para el modo específico.
Sí, el caso de uso ImageAnalysis pasa cada fotograma al analizador. Los fotogramas se convierten de YUV_420_888 a InputImage para ML Kit. Este es el patrón estándar para crear un escáner ML.
CameraX es una API de alto nivel con arquitectura de casos de uso, vinculación automática al ciclo de vida y manejo de diferencias específicas del dispositivo. Camera2 es una API de bajo nivel que proporciona control total de la cámara con una gran cantidad de código repetitivo.
Sí, el caso de uso VideoCapture se añadió en CameraX 1.1.0-beta. Graba video con micrófono y se sincroniza con Preview. Para escenarios más complejos, use Camera2 directamente.
Mediante CameraSelector: DEFAULT_BACK_CAMERA o DEFAULT_FRONT_CAMERA. Para cambiar, llame a cameraProvider.bindToLifecycle() con un nuevo selector — CameraX reiniciará la sesión automáticamente.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también