1. Code
  2. Coding Fundamentals
  3. Tools

Android SDK: Crea un lector de Código de Barras

En éste tutorial, usaremos la librería ZXing (Zebra Crossing) para llevar a cabo el escaneo de código de barras con una aplicación Android. Llamaremos a los recursos en ésta biblioteca de código abierto dentro de nuestra aplicación, tomando y procesando los resultados retornados.
Scroll to top

Spanish (Español) translation by Javier Salesi (you can also view the original English article)

En éste tutorial, usaremos la librería ZXing (Zebra Crossing) para llevar a cabo el escaneo de código de barras con una aplicación Android. Llamaremos a los recursos en ésta biblioteca de código abierto dentro de nuestra aplicación, tomando y procesando los resultados retornados.

Ya que estamos utilizando la librería ZXing, no necesitamos preocuparnos sobre usuarios sin el escáner o lector de código de barras instalado, porque las clases de intergración proporcionadas se encargarán de ésto por nosotros. Al importar las clases de integración ZXing en nuestra app, podemos hacer el usuario escanee más fácilmente y enfocar nuestros esfuerzos de desarrollo en el manejo de los resultados del escaneo. En una próxima serie, desarrollaremos una aplicación de escaneo de un libro donde construiremos la aplicación que creamos en éste tutorial. También agregaremos soporte para API de Google Books  para que podamos desplegar información sobre los libros escaneados.

1. Crea un Nuevo Proyecto Android

Paso 1

En Eclipse, crea un nuevo proyecto Android. Ingresa los nombres elegidos para tu aplicación, proyecto, y paquete. Deje que Eclipse cree una activity (actividad) vacía por tí, con el nombre de tu elección tanto para la activity como para su layout (maquetado).

New ProjectNew ProjectNew Project

Paso 2

Abre tu archivo layout principal. Con la configuración por defecto, Eclipse inicia tu layout con un objeto Relative Layout, que puedes dejar como está. Dentro de él, remplaza el contenido existente (típicamente un Text View) con un botón.

1
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2
  xmlns:tools="http://schemas.android.com/tools"
3
	android:layout_width="match_parent"
4
	android:layout_height="match_parent" >
5
	<Button android:id="@+id/scan_button"
6
		android:layout_width="wrap_content"
7
		android:layout_height="wrap_content"
8
		android:layout_centerHorizontal="true"
9
		android:text="@string/scan" />
10
</RelativeLayout>

Después del botón, añade dos Text Views en los cuales mostraremos la información del resultado del escaneo.

1
<TextView
2
	android:id="@+id/scan_format"
3
	android:layout_width="wrap_content"
4
	android:layout_height="wrap_content"
5
	android:textIsSelectable="true"
6
	android:layout_centerHorizontal="true"
7
	android:layout_below="@id/scan_button" />
8
<TextView
9
	android:id="@+id/scan_content"
10
	android:layout_width="wrap_content"
11
	android:layout_height="wrap_content"
12
	android:textIsSelectable="true"
13
	android:layout_centerHorizontal="true"
14
	android:layout_below="@id/scan_format" />

Agrega la cadena de texto del botón a tu archivo XML "res/values/strings".

1
<string name="scan">Scan</string>

El usuario presionará el botón para escanear. Cuando la aplicación recibe un resultado de la operación de escaneo de barra de códigos, mostrará los datos del contenido del escaneo y dará formato al nombre en los dos Text Views.

2. Añadir ZXing a tu Proyecto.

Paso 1

ZXing es una librería de código abierto que proporciona acceso al escaneo de código de barras probado y funcional en Android. Muchos usuarios ya tendrán la aplicación instalada en sus dispositivos, así que pueden lanzar simplemente los Intents (intenciones) de escaneo y tomar los resultados. En éste tutorial vamos a usar el método Scanning via Intent (Escaneo vía Intención) para hacer el escaneo más fácil. Éste método involucra importar un par de clases a tu aplicación y permite a ZXing encargarse de instancias donde el usuario no tiene instalado el escáner. Si el usuario no tiene instalado el escáner de código de barras, lo motivará a descargarlo.

Consejo: Ya que ZXing es de código abierto, puedes importar el código fuente a tus proyectos completamente. Sin embargo, ésto sólo es aconsejable si necesitas hacer cambios a su funcionalidad. También puedes compilar el proyecto e incluir su archivo JAR en tus propias aplicaciones si lo prefieres. Para la mayoría de los propósitos, usar Scanning via Intent es una forma más fácil y confiable de implementar opciones, además tus usuarios tendrán acceso a la versión más reciente de la aplicación ZXing.

En Eclipse, agrega un nuevo paquete a tu proyecto al dar click derecho en el directorio "src" y elige "New", luego "Package", e ingresa "com.google.zxing.integration.android" como el nombre del paquete.

New PackageNew PackageNew Package

Paso 2

Eclipse ofrece varias formas de importar código existente en tus proyectos. Para los fines de éste tutorial, probablemente te sea más fácil crear las dos clases requeridas y copiar el código desde ZXing. Da click derecho en tu nuevo paquete, elige "New" luego "Class" e ingresa "IntentIntegrator" como el nombre de la clase. Puedes dejar la otra configuración por defecto como está. Una vez que hayas creado ésta clase, haz lo mismo para la otra clase que estaremos importando, dándole "IntentResult" como el nombre de su clase.

New ClassNew ClassNew Class

Copia el código de ambas clases en la libreria ZXing y pégalo en los archivos de la clase que creaste. Éstos son IntentIntegrator y IntentResult. Consulta la descarga del código fuente si tienes dudas donde deberían estar los archivos y directorios o qué deberían contener.

Project Package

Ahora puedes importar las clases ZXing a la clase de tu Activity principal.

1
import com.google.zxing.integration.android.IntentIntegrator;
2
import com.google.zxing.integration.android.IntentResult;

Continúa y añade las otras declaraciones de import que utilizaremos en éste tutorial. Ten en cuenta que Eclipse ya podría haber añadido algunas por tí.

1
import android.os.Bundle;
2
import android.app.Activity;
3
import android.content.Intent;
4
import android.view.View;
5
import android.view.View.OnClickListener;
6
import android.widget.Button;
7
import android.widget.TextView;
8
import android.widget.Toast;

Puedes ver el contenido de las dos clases ZXing. Es muy sencillo, pero los detalles del proceso de escaneo de código de barras se llevan a cabo en otra parte de la librería. Éstas dos clases realmente actúan como una interfaz para la funcionalidad del escaneo.

Haz un escaneo.

Paso 1

Implementemos el escaneo cuando el usuario da click en el botón que agregamos.  En la clase principal de la activity de tu app, el método por defecto onCreate ingresado por Eclipse debería verse así:

1
protected void onCreate(Bundle savedInstanceState) {
2
	super.onCreate(savedInstanceState);
3
	setContentView(R.layout.activity_main);
4
}

Arriba de éste método, agrega las siguientes instancias de variables para representar el botón y dos Text Views que creamos en el archivo layout.

1
private Button scanBtn;
2
private TextView formatTxt, contentTxt;

En onCreate, despues del código existente, instancia éstas variables usando los valoes de ID que especificamos en el XML.

1
scanBtn = (Button)findViewById(R.id.scan_button);
2
formatTxt = (TextView)findViewById(R.id.scan_format);
3
contentTxt = (TextView)findViewById(R.id.scan_content);

Posteriormente, agrega un listener al botón para que podamos manejar los eventos de pulsar.

1
scanBtn.setOnClickListener(this);

Extiende la línea de apertura de la declaración de la clase para implementar la interfaz OnClickListener.

1
public class MainActivity extends Activity implements OnClickListener

Paso 2

Ahora podemos responder a los clicks de botón al comenzar el proceso de escaneo.  Añade un método onClick a tu clase activity.

1
public void onClick(View v){
2
//respond to clicks

3
}

Revisa si el botón de escaneo ha sido presionado en éste método.

1
if(v.getId()==R.id.scan_button){
2
//scan

3
}

Denro de éste bloque condicional, crea una instancia de la clase Intent Integrator que importamos.

1
IntentIntegrator scanIntegrator = new IntentIntegrator(this);

Ahora podemos llamar al método Intent Integrator para comenzar el escaneo.

1
scanIntegrator.initiateScan();

En éste punto, el escáner comenzará si está instalado en el dispositivo del usuario. Si no lo está, lo motivará a descargarlo. Los resultados del escaneo serán retornados a la clase de la activity principal donde se inició el escaneo, asi que podremos tomarlo en el método onActivityResult.

Consejo: Cuando llamas al método initiateScan, puedes elegir  pasar una colección de formatos de barras de códigos que quieres escanear. Por defecto, el método escaneará para todos los formatos soportados. Éstos incluyen UPC-A, UPC-E, EAN-8, EAN-13, QR Code, RSS-14, RSS Expanded, Data Matrix (Matriz de Datos), Aztec, PDF 417, Codabar, ITF, cODES 39, 93, Y 128. La librería ZXing también incluye opciones de escaneo de código de barras que no serán cubiertas en éste tutorial. Puedes checar el proyecto en Google Code para más información.

4. Tomar los Resultados del Escaneo

Paso 1

Cuando el usuario da click en el botón de escanear, el escáner de código de barras se lanzará. Cuando escanea un código de barras, retornará los datos escaneados al método onActivityResult de la activity que los solicita. Agrega el método a la clase de tu activity principal.

1
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
2
//retrieve scan result

3
}

Dentro del método, trata de parsear el resultado en una instancia de la clase ZXing Intent Result que importamos.

1
IntentResult scanningResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);

Paso 2

Al igual que cualquier dato siendo tomado de otra aplicación, es vital revisar si hay valores nulos.  Sólo procede si tenemos un resultado válido.

1
if (scanningResult != null) {
2
//we have a result

3
}

Si los datos del escaneo no son recibidos (por ejemplo, si el usuario cancela el escaneo al presionar el botón atrás), podemos simplemente mostrar un mensaje.

1
else{
2
	Toast toast = Toast.makeText(getApplicationContext(), 
3
		"No scan data received!", Toast.LENGTH_SHORT);
4
	toast.show();
5
}

De vuelta en el bloque if, encontremos que datos retornó el escaneo. El objeto Intent Result proporciona métodos para tomar el contenido del escaneo y el formato de los datos retornados de él. Toma el contenido como un valor de string (cadena).

1
String scanContent = scanningResult.getContents();

Toma el nombre del formato, también como un string.

1
String scanFormat = scanningResult.getFormatName();

Paso 3

Ahora tu programa tiene el formato y el contenido de los datos escaneados, así que puedes hacer cualquier cosa que quieras con ellos. Para el propósito de éste tutorial, sólo escribiremos los valores para los Text Views en nuestro layout.

1
formatTxt.setText("FORMAT: " + scanFormat);
2
contentTxt.setText("CONTENT: " + scanContent);

Ejecuta tu aplicación en un dispositivo en lugar de un emulador para que puedas ver el escaneo funcionando. Trata de escanear un libro o cualquier otro código de barras.

App During ScanningApp During ScanningApp During Scanning

Cuando el escaneo es iniciado, el usuario es llevado a la aplicación ZXing para escanear un código de barras.
Scan ResultScan ResultScan Result

Los resultados del escaneo son retornados a la aplicación.

Conclusión

En éste tutorial, hemos recorrido el proceso de facilitar el escaneo de código de barras dentro de aplicaciones Android utilizando la librería ZXing. En tus propias aplicaciones, podrías querer llevar a cabo un mayor proceso en la toma de los resultados del escaneo, como la carga de URLs o buscar los datos en una fuente de datos de terceros. En el próximo tutorial, usaremos la funcionalidad de escaneo de código de barras para crear una aplicación de escaneo de libros que nos permitirá recuperar datos de libros escaneados de la  API de Google Books.

¡Sé el primero en conocer las nuevas traducciones–sigue @tutsplus_es en Twitter!