[Windows Phone] Leer códigos de barras

 BarcodeIntroducción

Un código de barras es una forma de representar graficamente un conjunto de información de modo que pueda ser facilmente leida por una máquina.

En nuestro día a día estamos acostumbrados a ver códigos de barras por todos lados, en el último libro que leiste, en ese CD de música que te asombro e incluso en el cartón de leche de tu desayuno. En distintos formatos y tipos pero sin duda, son un factor importante. El formato más comun es un conjunto de barras verticales paralelas entre si utilizadas para identificar un producto en concreto. A este conjunto de códigos de barras con líneas verticales se les conoce como 1D (1 Dimensión). Tambien tenemos otro conjunto de códigos basados en patrones geométricos diseñados para almacenar más información. Son los conocidos como 2D (2 Dimensiones) donde el representante más conocido es el código QR.

En este artículo vamos a aprender como generar códigos QR desde nuestra aplicación Windows Phone. ¿Te apuntas?

Windows Phone y los códigos de barras

Desde Windows Phone 7 se pueden leer un conjunto de los códigos de barras más importantes como EAN-13 o los códigos QR directamente con la aplicación de búsqueda Bing Vision sin la necesidad de instalar ningun App para ello.

ZXing.Net

Para generar códigos de barras desde nuestra aplicación Windows Phone utilizaremos la librería ZXing.Net. Esta librería es un port de la librería open spurce ZXing.

Escaneando códigos de barras

Como solemos hacer, vamos a crear una Aplicación de ejemplo para aprender como generar códigos de barras utilizando la librería ZXing.Net desde Windows Phone:

Creamos un proyecto desde la plantilla más básica para concentrar nuestra atención en la librería ZXing.NET que nos ocupa en esta entrada.

Lo primero que debemos hacer para poder trabajar con la librería es… obtener la librería. Para ello, en el Explorador de soluciones, hacemos clic derecho sobre las referencias del proyecto y elegimos la opción Manage NuGet Packages…

En la ventana que nos aparece buscaremos por la palabra “ZXing” e instalamos la opción  llamada “ZXing.Net” de las disponibles:

Instalando la librería ZXing.Net
Instalando la librería ZXing.Net

NOTA: También podemos instalar la librería con el Package Manager Console ejecutando el siguiente comando: Install-Package ZXing.Net

Todo listo. Comenzamos!

Los primero que necesitaremos para escanear el código de barras será… la cámara!. En Windows Phone contamos con la clase PhotoCamera que nos da acceso a las funcionalidades de la cámara del dispositivo incluidas opciones de flash, focus, opciones de resolución, etc. Creamos en el constructor de la aplicación una instancia de PhotoCamera:

_phoneCamera = new PhotoCamera();

Nos suscribimos a su evento Initialized, lanzado con la inicialización de la cámara:

_phoneCamera.Initialized += cam_Initialized;

En la inicialización de la cámara haremos lo siguiente:

if (e.Succeeded)
{
     Dispatcher.BeginInvoke(delegate
     {
          _phoneCamera.FlashMode = FlashMode.Off;
          _previewBuffer = new WriteableBitmap((int)_phoneCamera.PreviewResolution.Width,
          (int)_phoneCamera.PreviewResolution.Height);

          _barcodeReader = new BarcodeReader { Options = { TryHarder = true } };

          _barcodeReader.ResultFound += _bcReader_ResultFound;
          _scanTimer.Start();
     });
}

Analicemos el código anterior antes de continuar. Establecemos varias propiedades básicas del objeto de tipo PhoneCamera como el flash por ejemplo. Inicializamos el objeto de tipo BarCodeReader encargado de decodificar el código capturado por la cámara. Nos suscribimos al evento ResultFound del BarCodeReader que se lanzará cuando un código es capturado. Por último lanzamos el Timer que inicializamos en el constructor. Este Timer se encargará de escanear códigos de barras constantemente. Veamos su inicialización:

 _scanTimer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(100) };
_scanTimer.Tick += (o, arg) => ScanForBarcode();

Como podemos ver en el código anterior cada 100 milisegundos se lanzará el método ScanForCode. El método llamado ScanForBarCode que obtendrá el resultado capturado por la cámara y se lo pasará al BarCodeReader utilizando su método Decode. El método Decode es capaz de decodificar los siguientes formatos: UPC-A, UPC-E, EAN-8, EAN-13, Code 39, Code 93, Code 128, ITF, Codabar, MSI, RSS-14 (all variants), QR Code, Data Matrix, Aztec y PDF-417.

private void ScanForBarcode()
{
     _phoneCamera.GetPreviewBufferArgb32(_previewBuffer.Pixels);
     _previewBuffer.Invalidate();
     _barcodeReader.Decode(_previewBuffer);
}

Nos suscribimos al evento ResultFound de modo que cuando se encuentre un código de barras de cualquiera de los formatos soportados:

private void _bcReader_ResultFound(Result obj)
{
     if (obj.Text.Equals(_barCode)) return;
     VibrateController.Default.Start(TimeSpan.FromMilliseconds(100));
     MessageBox.Show(string.Format("Código capturado!. Formato: {0}, Contenido: {1}", obj.BarcodeFormat, obj.Text));
     _barCode = obj.Text;
}

Se producirá una pequeña vibración notificando al usuario junto a un mensaje indicando el formato y el contenido del código de barras.

Podéis descargar el ejemplo a continuación:

Más información

Un pensamiento en “[Windows Phone] Leer códigos de barras

  1. Hola, me parece muy bueno el aporte😀 gracias.
    una pregunta en windows phone 8.1 que librerias debo ocupar o que cambio? ya que realizo los mismos pasos y no puedo crear un objeto de la clase phonecamera

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s