Escáner de código de barras con CameraX y MLKit lähde: Miguel Lasa | Octubre de 2020

Código de barras e íconos de Android de Freepik z www.flaticon.com

Hola a todos, ¡bienvenidos a mi primera historia intermedia! Recientemente agregué algunas funciones de escaneo de códigos de barras a una de mis aplicaciones y decidí compartir lo que aprendí aquí. La primera vez que escribí algo así, muy claro conmigo, muchachos, y si toman UNA cosa útil de este artículo, entonces …

¡Vamos a romper!

Entonces, ¿de qué se tratará? Simplemente usamos la cámara de nuestro dispositivo para apuntar al código de barras y extraer el «valor» del código de barras para que podamos usarlo para futuras búsquedas, consultas o cualquier otra cosa.

Mi arDividiré la aplicación en tres partes:

  1. Configuración de CameraX y su Avance caso de uso
  2. Integración de MLKit en nuestro proyecto y preparación de un lector de códigos de barras
  3. Alimente la imagen de la cámara al escáner usando CameraX Análisis de imagen caso de uso

Sencillo.

CameraX no es más que una biblioteca de soporte de Jetpack para … bueno … trabajar con la cámara. Introduce el concepto caso de usoque actualmente son tres: Avance, Análisis de imagen, una Captura de imagen. Solo estamos interesados Avance utilice el caso por el momento.

Primero necesitamos agregar las siguientes dependencias a archivo build.gradle (módulo: aplicación):

implementation "androidx.camera:camera-camera2:$camerax_version"
implementation "androidx.camera:camera-lifecycle:$camerax_version"
implementation "androidx.camera:camera-view:1.0.0-alpha18"

Asegúrese de que el siguiente complemento también esté en la parte superior:

apply plugin: 'kotlin-android-extensions'

Y usaremos Java 8, por lo que configuraremos nuestras opciones de compilación de esta manera:

compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}

Un paso bastante simple, solo agregue y Vista previa según su diseño. Esta es la vista a la que transmitirá la cámara una vez que esté activa. Algo como esto:

En nuestra Actividad / Fragmento solicitaremos los permisos necesarios y luego de otorgar estos permisos iniciaremos la cámara. En aras de la brevedad, aquí está el código necesario para iniciar la cámara. El código completo está disponible en el repositorio.

Así que iniciemos la cámara. Asegúrese de leer los comentarios dentro del fragmento de código si desea comprender con más detalle startCamera () método.

Esto cambiará un poco más tarde, pero es suficiente para que la cámara comience a transmitir en la pantalla.

Hasta ahora tan bueno. Dejémoslo así por un tiempo y volveremos a eso más tarde.

Que es MLKit? Y que hace

ML Kit es un SDK para dispositivos móviles que lleva la experiencia de Google en aprendizaje automático a las aplicaciones de Android e iOS.

…y…

Todas las API del Kit de AA se ejecutan en el dispositivo, lo que permite el uso en tiempo real cuando desea procesar una transmisión en vivo desde una cámara, por ejemplo.

MLKit tiene aplicaciones BUNKU, desde detección de posición hasta reconocimiento de tinta digital. Por supuesto, estamos interesados ​​en las posibilidades de escanear códigos de barras.

MLKit también puede extraer mucha más información de un código de barras que su valor bruto, como los detalles del punto de acceso WiFi o las coordenadas geográficas.

Para cada código de barras, puede obtener sus coordenadas delimitadoras en la imagen de entrada, así como los datos sin procesar codificados por el código de barras. Además, si el lector de códigos de barras pudo determinar el tipo de datos codificados con códigos de barras, puede obtener un objeto que contenga los datos analizados.

No usaremos ninguna de esta información codificada, pero puede leer más al respecto. aquí.

Agregue la siguiente dependencia a archivo build.gradle (módulo: aplicación):

implementation 'com.google.mlkit:barcode-scanning:16.0.3'

A continuación, crearemos una clase llamada Analizador de código de barrasque implementa ImageAnalysis.Analyzer interfaz. Entonces lo pasaremos ImageAnalysis.setAnalyzer recibir imágenes y realizar nuestro procesamiento.

Algunas cosas a tener en cuenta:

Incluso si solo llamas BarcodeScanning.getClient () conseguir una instancia Lector de código, es posible que queramos hacer alguna configuración previa, como escanear códigos QR. Esto se puede lograr fácilmente con BarcodeScannerOptions constructor que puede registrar documentación.

También en otros proyectos, es posible que vea algún método de «compensación de compensación» o un fragmento de código que hace girar el dispositivo y realiza algunos cálculos. En este caso, no es necesario porque ImageAnalysis.Analyzer lo hace por nosotros. Puede ver el valor de rotación como el segundo parámetro k InputImage.fromMediaImage método.

Finalmente oyente de código de barras vamos a pasar el analizador no es más que una instancia de esto:

typealias BarcodeListener = (barcode: String) -> Unit

Tenemos una vista previa de la cámara funcional y un lector de código de barras que extrae el valor del código de barras de la imagen. Déjalos trabajar juntos.

En nuestro fragmento, justo después de crear nuestra vista previa, crearemos una instancia Análisis de imagen caso de uso. Análisis de imagen recupera imágenes de la cámara a través de ImageReader y les proporciona ImageAnalysis.Analyzer (nuestra Analizador de código de barras).

Aquí está procesamiento de código de barras AtómicoBooleano, no es más que una bandera que nos ayuda a procesar un código de barras a la vez y evitar una avalancha de llamadas a searchBracode método. Este método es solo una operación que queremos hacer con el valor del código de barras leído. Para los propósitos de este proyecto, después de una lectura exitosa, searchBarcode el método nos lleva a una pantalla exitosa después de un retraso de 1 segundo.

los CamaraExecutor es el ejecutor en el que se ejecutará el analizador:

cameraExecutor = Executors.newSingleThreadExecutor()

Ahora debemos agregar este caso de uso a la llamada al método que vincula los casos de uso a livecycleOwner… parte del código dentro Tratar de atrapar bloque, recuerdas? Así que esto…

… Se convierte en esto.

Debería cubrir todo lo que necesitamos …

Está bien, está bien, ¡intentémoslo y veamos qué pasa!

¡Si! Entonces, lo que ve es un empaque semi-marrón para barras de chocolate y un escáner que lee correctamente el código de barras del empaque.

Recuerda que realmente no estamos haciendo nada con el código que estamos escaneando, la barra de progreso aparecerá por un segundo y luego iremos a la pantalla de «éxito». Hay un lugar donde realizaría una consulta real, una llamada a la API o cualquier otra cosa que necesite hacer.

Aquí están los enlaces a la documentación y al repositorio:

Repo Github:
github.com/BarcodeScannerSample.git

Documentación de CameraX:
https://developer.android.com/training/camerax

CameraX Codelab (me encantan estas cosas):
https://codelabs.developers.google.com/codelabs/camerax-getting-started/#0

Documentación de MLKit:
https://developers.google.com/ml-kit/guides

Realmente espero que hayan disfrutado el artículo, que haya valido la pena leerlo y, con suerte, pronto encontraré algo que valga la pena compartir.

¡Hasta la proxima vez!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *