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..
Para seguir este tutorial, necesitarás:
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.
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
"
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.
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"));
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.
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
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.
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.
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
"
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 receiveDetections (Detector.Detectionsdetecciones) ); "
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
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..
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..