Design market

Android Ayuda » Aplicaciones » Recomendadas

12 minutos

¿Te has planteado alguna vez cómo llevar el reconocimiento de códigos de barras o la detección de objetos a tu app Android sin perder la vida integrando librerías extrañas o arriesgándote con APIs de terceros? Pues hoy estás de suerte, porque vamos a destripar a fondo cómo usar el escáner de MLKit en Android, aprovechando la tecnología de Google para el aprendizaje automático directamente desde tu móvil o tableta. Lo mejor de todo es que no necesitas ser un crack en inteligencia artificial ni tener experiencia previa con modelos de ML, ya que MLKit se encarga de la trastienda y tú solo tienes que seguir unos pasos (y algunos consejos de los que casi nadie habla, que verás aquí).

En este artículo vamos a repasar a fondo absolutamente todo lo que debes saber sobre la integración y uso práctico del escáner de MLKit en Android: desde los requisitos mínimos, las diferencias entre los tipos de integración, cómo preparar las imágenes para obtener escaneos precisos, los detalles de configuración, ejemplos de código, optimización para apps en tiempo real y trucos para gestionar casos complejos. Recoge tu café y acomódate, que el viaje va a ser largo pero merece la pena: aquí tienes una guía actualizada, directa y sin rodeos.

Primero lo primero. MLKit es el Kit de Aprendizaje Automático desarrollado por Google para armarnos herramientas de visión artificial, procesamiento de lenguaje, detección de objetos y mucho más, directamente en nuestras aplicaciones móviles, tanto para Android como para iOS. En nuestro caso, nos centraremos en Android y, más concretamente, en la funcionalidad de escaneo de códigos de barras y detección de objetos.

Integrar el escáner de MLKit tiene ventajas realmente jugosas: no dependes de servicios externos ni necesitas conexión a Internet, porque el machine learning corre en el propio dispositivo; puedes procesar imágenes en tiempo real y obtener reconocimiento instantáneo de códigos o incluso de objetos; y además dispones de un SDK que se actualiza con frecuencia y está respaldado por Google.

¿Y qué se puede detectar? La lista es bastante completa: distintos formatos de códigos de barras, QR, PDF417, Aztec, Data Matrix, e incluso objetos y rostros (aunque estos dos últimos, para quien quiera rizar el rizo). Además, MLKit ofrece APIs tanto para detección como para seguimiento, ideal si tu app trabaja con streams de vídeo o usa la cámara de forma intensiva.

Antes de ponerse manos a la obra, es fundamental tener claro qué necesitas para empezar sin tropezar en lo básico. MLKit exige como mínimo Android API 21 (Android 5.0) o superior. Eso implica que, en tu archivo build.gradle de nivel del módulo deberás asegurarte de tener minSdkVersion 21 o más.

Además, dependiendo del tipo de integración que elijas (luego hablaremos de esto), necesitarás añadir ciertas dependencias. MLKit se puede integrar de dos formas:

¿Qué dependencias tienes que añadir?

En el build.gradle del módulo (por ejemplo, app/build.gradle):

En ambos casos, recuerda incluir el repositorio Maven de Google en la sección de buildscript y allprojects de tu build.gradle de proyecto.

El siguiente paso es decidir qué tipos de códigos de barras u objetos vas a escanear y configurar el escáner para que sea lo más eficiente posible. MLKit te permite especificar exactamente qué formatos debe buscar, lo que puede incrementar la velocidad del detector considerablemente. Por ejemplo, si solo te interesa escanear códigos QR y Aztec, lo puedes limitar explícitamente.

Esto se logra creando un objeto BarcodeScannerOptions e indicando los formatos deseados. La lista completa de soportados incluye, entre otros: Code 128, Code 39, Code 93, Codabar, EAN-13, EAN-8, ITF, UPC-A, UPC-E, QR, PDF417, Aztec y Data Matrix.

La clave para un rendimiento de diez no solo está en limitar los formatos, sino también en aprovechar las capacidades de la API como:

Esta función de auto-zoom requiere gestionar el callback ZoomCallback, que deberías implementar para ajustar el ratio de zoom de la cámara según lo que sugiere la librería. Así, podrás adaptarte al hardware de cada dispositivo y potenciar la legibilidad de los códigos en cada toma.

Para que el detector haga magia, necesitas transformar la imagen a un formato que MLKit entienda. Aquí es donde entra InputImage, la clase universal compatible con la API. Puedes crearla a partir de distintas fuentes, según cómo estés obteniendo la imagen:

Truco relevante: Si usas CameraX, las clases OnImageCapturedListener y ImageAnalysis.Analyzer ya calculan automáticamente la rotación de la imagen; solo tienes que pasársela a InputImage.fromMediaImage(). Si no, deberás calcular la rotación manualmente según la orientación del sensor y el estado del dispositivo (para que no te salga la imagen invertida).

Una vez tienes el InputImage preparado, solo queda enviarlo al escáner a través del método process(image) y gestionar el resultado a través de listeners de éxito o error.

Para que el escaneo sea un éxito y no un mar de frustraciones, hay algunos detalles sobre las imágenes que debes tener en cuenta:

Recuerda que formatos muy densos (como PDF417) requieren todavía más resolución. Además, en el caso de Data Matrix, el código debe cruzar el centro de la imagen para que se detecte y solo se reconoce uno por imagen.

Visto lo básico, es hora de meterse en harina con una integración típica. Aquí tienes los pasos que debes seguir para poner en marcha un escáner de códigos de barras usando MLKit en Android:

Todo esto ocurre en tiempo real y en el propio dispositivo, sin enviar datos fuera ni depender de la velocidad de red.

El kit de Google no solo vale para códigos de barras. El componente de detección de objetos (Object Detection and Tracking, ODT) te permite encontrar hasta cinco objetos en una imagen y hacerles seguimiento entre frames de vídeo. Es ideal para apps que quieren señalar productos, personas u objetos en tiempo real.

Al configurar el detector, puedes decidir si quieres:

Si usas stream, se asignan IDs de tracking a cada objeto para seguirlos entre frames. Puedes obtener coordenadas, etiquetas, índices y nivel de confianza de cada detección. Eso sí, para apps en tiempo real, se recomienda no activar la clasificación ni la detección múltiple si tu objetivo es la máxima velocidad, ya que aumentan la carga de procesamiento.

Hoy en día, lo normal es usar CameraX en nuevas apps Android. MLKit se integra perfectamente con CameraX a través de la interfaz ImageAnalysis.Analyzer. Usando la clase MlKitAnalyzer, puedes recibir los frames, pasarlos a los detectores de MLKit y obtener los resultados ya transformados al sistema de coordenadas del PreviewView (perfecto para superponer cajas y gráficos).

Para ponerlo en marcha:

CameraX y MLKit se entienden de maravilla y te permiten hacer visualizaciones en tiempo real con apenas unas líneas extra. Además, CameraX gestiona la rotación y el formato de imagen de forma robusta, así que te evitas muchos dolores de cabeza.

El gran reto cuando queremos escanear o detectar objetos en tiempo real es mantener una tasa de frames fluida y latencia baja. Para eso:

Otro consejo habitual es comprobar que la API que uses cierre correctamente los proxies de imagen (ImageProxy.close()) cuando termines con cada frame, evitando así fugas de memoria y retrasos acumulados.

Para que te hagas una idea más clara, aquí tienes una estructura típica (simplificada) de cómo podrías implementar el escaneo con MLKit en una app Android (en Kotlin):

Cada vez que se detecta un código, puedes leer su valor, su formato y los datos analizados. Si quieres mostrar la caja en pantalla, usa las coordenadas del bounding box.

MLKit va más lejos que el escaneo de códigos. Puedes añadir reconocimiento de texto (OCR) para capturar textos en imágenes o fotos, o incluso implementar detección de puntos de referencia famosos (ideal para apps de turismo o información).

El flujo es muy similar: añades las dependencias pertinentes (com.google.mlkit:face-detection para caras, com.google.android.gms:play-services-mlkit-text-recognition para OCR, etc.), preparas el InputImage y procesas con el detector correspondiente. El API de resultados te permite acceder a los datos reconocidos (por ejemplo, los textos encontrados, su posición, etc.), y superponerlos en pantalla.

Integrar el escáner de MLKit es sencillo si sigues las recomendaciones, pero aquí van algunos trucos para evitar los fallos clásicos:

El mundo real está lleno de situaciones inesperadas, así que añade logs, gestiona los errores en los listeners y ofrece feedback amigable al usuario cuando el escaneo no salga bien.

Como has visto a lo largo de esta guía, MLKit es una de las herramientas más versátiles y robustas para integrar escaneo avanzado en Android, tanto para proyectos profesionales como para apps más experimentales. Con una preparación correcta, podrás identificar y procesar códigos de barras, objetos, textos y mucho más en tiempo real y sin complicaciones, aprovechando el potencial del machine learning de Google directamente en el bolsillo del usuario. Si dedicas unos minutos a seguir las buenas prácticas y pulir los detalles, tus usuarios lo agradecerán y tu app estará lista para destacar entre la competencia.