Leyendo códigos QR usando la API de Mobile Vision

Introducción

Los códigos QR se han vuelto omnipresentes en los últimos años. Estoy seguro de que has visto uno en un anuncio de periódico o en una valla publicitaria. En términos sencillos, los códigos QR, como todos los demás códigos de barras, son imágenes que están diseñadas para ser leídas por las máquinas. Por lo general, representan una cadena pequeña, como una URL acortada o un número de teléfono. Aquí hay un código QR de muestra que contiene la URL de la página de inicio de Tuts +:

A diferencia de los códigos de barras tradicionales, que necesitan hardware especializado, los códigos QR pueden leerse con precisión en cualquier teléfono inteligente con una cámara decente.

La última versión del SDK de servicios de Google Play incluye la API de visión móvil que, entre otras cosas, hace que sea muy fácil para los desarrolladores de Android crear aplicaciones capaces de detectar y leer códigos QR en tiempo real. En este tutorial, te ayudaré a comenzar con él..

Prerrequisitos

Para seguir este tutorial, necesitarás:

  • La última versión de Android Studio
  • Un dispositivo Android con una cámara.

1. Instalar el SDK de servicios de Google Play

Antes de utilizar la API de Mobile Vision en su aplicación, debe agregar los servicios de Google Play SDK 7.8 como una compilar dependencia en tu aplicación módulo de construir.gradle.

compilación genial 'com.google.android.gms: play-services: 7.8.0'

Cuando presionas el Sincronizar ahora botón, verá un error que se ve así:

Haga clic en el Instalar repositorio y sincronizar proyecto enlace para instalar el SDK.

2. Editar el manifiesto de la aplicación.

Agregue la siguiente línea a su aplicación AndroidManifest.xml para instalar automáticamente las bibliotecas de detección de códigos de barras en los dispositivos que intentan ejecutar su aplicación:

"xml

"

Además, como usará la cámara del dispositivo para capturar los códigos QR, debe solicitar la android.permission.CAMERA permiso.

"xml

"

3. Leyendo un código QR de una foto

Ahora escribamos un código que pueda leer un código QR de una foto almacenada en su aplicación bienes carpeta. Voy a nombrar la foto myqrcode.jpg. Si no tiene a mano ninguna foto que contenga códigos QR, puede obtenerlas en Flickr.

Paso 1: Convertir la foto en un Mapa de bits

Porque la API de visión móvil necesita un Mapa de bits como entrada, primero debes convertir tu foto en una Mapa de bits. Para ello, abre la foto utilizando el abierto método de la Gestor de activos clase y pasar el Flujo de entrada regresó a la decodificar stream método de BitmapFactory. Para que sea sencillo, hazlo dentro de la onCreate método de tu Actividad.

java Bitmap myQRCode = BitmapFactory.decodeStream (getAssets (). open ("myqrcode.jpg"));

Paso 2: crear un detector de código de barras

Para detectar códigos QR (y otros tipos de códigos de barras), debe usar una instancia de Detector de código de barras clase. El siguiente código le muestra cómo crear uno usando BarcodeDetector.Builder:

java BarcodeDetector barcodeDetector = new BarcodeDetector.Builder (this) .setBarcodeFormats (Barcode.QR_CODE) .build ();

Tenga en cuenta que, de manera predeterminada, el detector detectará códigos de barras de todos los formatos compatibles. He usado el setBarcodeFormats Método para especificar explícitamente que el detector solo debe detectar códigos QR.

Paso 3: Lee el código QR

Utilizar Frame.Builder para crear un Cuadro utilizando la Mapa de bits tu creaste antes.

java Frame myFrame = new Frame.Builder () .setBitmap (myQRCode) .build ();

Llama a detectar método de la Detector de código de barras para generar un SparseArray que contiene todos los códigos QR del Detector de código de barras detectado en tu foto.

java SparseArray barcodes = barcodeDetector.detect (myFrame);

Cada elemento de la SparseArray contiene una Código de barras objeto. Para obtener los contenidos en bruto del código QR, puede utilizar el Código de barras objetos valor bruto campo. Sin embargo, te sugiero que uses el más fácil de leer. displayValue campo en su lugar. Aquí hay algunos códigos que imprimen el contenido del primer código QR que detectó la API:

"java // Compruebe si se detectó al menos un código de barras si (barcodes.size ()! = 0)

// Imprima el mensaje Log.d del código QR ("Datos de mi código QR", barcodes.valueAt (0) .displayValue);  "

Si corres tu Actividad ahora, debería poder ver el mensaje contenido en el código QR de su foto.

4. Leyendo un código QR usando la cámara

La API de visión móvil también hace que sea muy fácil detectar y leer códigos de barras con la cámara de su dispositivo en tiempo real. Vamos a crear un nuevo Actividad eso hace justamente eso.

Paso 1: Definir el diseño

Crear un nuevo archivo XML de diseño llamado activity_main.xml. El diseño debe tener un SurfaceView para visualizar los fotogramas de vista previa capturados por la cámara. Si lo desea, también puede agregar un Vista de texto para visualizar el contenido de los códigos QR que detecta la API.

Después de usar un Disposición relativa para posicionar ambos widgets, el archivo XML de diseño debería tener este aspecto:

"xml

"

Paso 2: Crea el Actividad

Crear una nueva clase de Java llamada MainActivity.java. Que sea una subclase de Actividad y anular su onCreate método. Dentro de onCreate método, llamada setContentView para aplicar el diseño que creó en el paso anterior. A continuación, utilice findViewById para obtener referencias a los widgets definidos en el diseño.

"java setContentView (R.layout.activity_main);

cameraView = (SurfaceView) findViewById (R.id.camera_view); barcodeInfo = (TextView) findViewById (R.id.code_info); "

Para obtener un flujo de imágenes de la cámara del dispositivo y visualizarlas en la SurfaceView, crear una nueva instancia de la Fuente de cámara clase usando CameraSource.Builder. Porque el Fuente de cámara necesita un Detector de código de barras, crear uno usando el BarcodeDetector.Builder clase. Si lo desea, puede ajustar las dimensiones de la vista previa de la cámara utilizando el setRequestedPreviewSize método.

"java barcodeDetector = new BarcodeDetector.Builder (this) .setBarcodeFormats (Barcode.QR_CODE) .build ();

cameraSource = new CameraSource .Builder (este, BarcodeDetector) .setRequestedPreviewSize (640, 480) .build (); "

A continuación, agregue una devolución de llamada a la SurfaceHolder del SurfaceView para que sepa cuándo puede empezar a dibujar los marcos de vista previa. La devolución de llamada debe implementar el SurfaceHolder.Callback interfaz.

"java cameraView.getHolder (). addCallback (new SurfaceHolder.Callback () @Override public void surfaceCreated (titular de SurfaceHolder)

@Override public void surfaceChanged (titular de SurfaceHolder, formato int, ancho int, int int)  @Override public void surfaceDestroyed (titular de SurfaceHolder) ); "

Dentro de superficie creada método, llamar al comienzo método de la Fuente de cámara para empezar a dibujar los fotogramas de vista previa. Porque el comienzo El método espera que manejes un IOException, deberias llamarlo desde dentro de un trata de atraparlo bloquear.

java try cameraSource.start (cameraView.getHolder ()); catch (IOException ie) Log.e ("CAMERA SOURCE", ie.getMessage ());

Del mismo modo, dentro de la superficie destruida método, llamar al detener método de la Fuente de cámara para dejar de dibujar los cuadros de vista previa.

java cameraSource.stop ();

Tu Actividad esta casi listo Sin embargo, usted todavía necesita decirle al Detector de código de barras Qué debe hacer cuando detecta un código QR. Crear una instancia de una clase que implemente el Detector.processor interfaz y pasarlo a la setProcessor método de la Detector de código de barras. Android Studio generará automáticamente stubs para los métodos de la interfaz.

"java barcodeDetector.setProcessor (nuevo Detector.Processor() @Override public void release ()

@Override public void receiveDetections (Detector.Detections detecciones) ); "

Dentro de recibirDetecciones método, obtener el SparseArray de Código de barras objetos llamando al getDetectedItems método de la Detector.Detecciones clase. Ahora puede escribir el código para hacer algo con los códigos QR detectados, porque ya le he mostrado cómo trabajar con SpareArray objetos anteriormente en este tutorial.

Así es como puedes visualizar los códigos QR displayValue en el Vista de texto:

"java final SparseArray códigos de barras = detections.getDetectedItems ();

if (barcodes.size ()! = 0) barcodeInfo.post (new Runnable () // Use el método de publicación de TextView public void run () barcodeInfo.setText (// Actualice TextView barcodes.valueAt (0 ) .displayValue);); "

Tenga en cuenta que debe incrustar la llamada a la setText método dentro de una llamada a la enviar método de la Vista de texto, porque recibirDetecciones no se ejecuta en el hilo de la interfaz de usuario. De no hacerlo, se producirá un error de tiempo de ejecución..

Ahora puede compilar y ejecutar su aplicación. Apunte la cámara de su dispositivo a un código QR y debería poder ver el contenido del código QR inmediatamente..

Conclusión

En este tutorial, aprendió a usar la API de visión móvil para leer códigos QR de imágenes estáticas así como de transmisiones en vivo de cámaras. Aunque solo trabajamos con códigos QR en este tutorial, también puede usar la API para leer otros formatos de código de barras populares como UPC-A y EAN-13..

Para obtener más información sobre la API de Mobile Vision, recomiendo visitar la documentación de la API..