Esta es una guía definitiva para usar la librería ZXing en nuestras aplicaciones Android y esta basada en parte en otras guías como jstyl8.blogspot.com y androideity.com, pero explicado de forma sencilla y con casos actuales.
Descargar ZXing
Opcional mente se puede mandar un extra para especificar que tipo de código leeremos, por ejemplo si queremos leer solamente códigos QR.
intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
Para obtener los resultados obtenidos después de capturar, dentro de la activity en donde estamos manejando.
Con eso ya podemos usar la librería ZXing para capturar códigos, el siguiente paso es generar códigos que también se lo puede hacer con esta fantástica librería.
Generar códigos con ZXing
Para poder generar un código QR y mostrarla en otra Activity solamente hay que hacer uso de un Intent, sin realizar otras configuraciones
Intent intent = new Intent("com.google.zxing.client.android.ENCODE");
intent.putExtra("ENCODE_TYPE", "TEXT_TYPE");
intent.putExtra("ENCODE_DATA", "Hola ZOMWI!!!");
startActivity(intent);
Lo que hará este código es mostrar en otra activity la imagen del código QR generado que almacena el texto "Hola ZOMWI!!!".
Podemos reemplazar el tipo de QR colocando en vez de "TEXT_TYPE", EMAIL_TYPE, PHONE_TYPE, SMS_TYPE u otro colocando su respectivo dato para la generación.
Cualquier duda o consulta pueden hacerla en los comentarios, estaré gustoso en responder si desean mas ejemplos o algo concreto.
Primero se explicara lo que es ZXing, donde obtenerlo, luego se mostrará como usarlo en una aplicación Android tanto para leer códigos y generarlos.
Introducción a ZXing
Introducción a ZXing
ZXing es una librería procesadora de imágenes multi-formato en 1D/2D y de código abierto. Actualmente es capaz de reconocer los formatos UPC-A, UPC-E, EAN-8, EAN-13, Códigos 39, 93, 128, ITF, Codabar, RSS-14 (en todas sus variantes), Matriz de datos (Data Matrix), Aztec, PDF 417 y por supuesto los populares códigos QR, muy usados desde que la tecnología móvil esta presente en nuestras vidas.
Si hablamos de los códigos QR, Zxing tiene su propio generador online zxing.appspot.com, pero también existe www.unitaglive.com que es prácticamente la mejor con la que podemos crear códigos totalmente personalizados, con logos, degradados, etc.
Descargar ZXing
El sitio oficial del proyecto es code.google.com/p/zxing/, desde ahí podemos descargar el código completo del proyecto, proyectos para diferentes clientes móviles y ademas podemos descargar el APK de una de las mejores aplicaciones para Android de lectura de códigos Barcode Scanner y una aplicación de ejemplo de uso de la librería ZXing Test. Todo lo que necesitamos para usarla es el siguiente archivo:
ZXing-2.0.zip (68.7 MB)
En esta guía se usa el IDE Eclipse versión 4.2 Juno con el complemento ADT 20.0.3 y Android SDK 20.0.3.
Una vez descargado el archivo tenemos el código fuente de la aplicación Barcode Scanner (no como librería). Si queremos usarla como una libreria y usarla sin depender de la aplicación Barcode Scanner (si no hacemos esto podemos usar el integrador para poder depender de la aplicación) seguiremos los siguientes pasos:
Configurar como librería
En esta guía se usa el IDE Eclipse versión 4.2 Juno con el complemento ADT 20.0.3 y Android SDK 20.0.3.
Una vez descargado el archivo tenemos el código fuente de la aplicación Barcode Scanner (no como librería). Si queremos usarla como una libreria y usarla sin depender de la aplicación Barcode Scanner (si no hacemos esto podemos usar el integrador para poder depender de la aplicación) seguiremos los siguientes pasos:
1. Extraer el contenido del archivo descargado.
2. Importar el proyecto que esta dentro de la carpeta "android" (es la aplicación Barcode Scanner) del archivo que extrajimos, como se lo muestra en el gráfico.
3. Corregimos errores que se presentan al importar el proyecto.
- Cambiamos la versión del compilador Java, Eclipse por defecto lo mantiene en 1.5 y el proyecto esta escrita en 1.6, para ello clic derecho en el proyecto y luego Properties, ir al apartado de Java Compiler luego cambiar la opción de Compiler compliance level a 1.6, clic en OK, posteriormente nos pedirá si deseamos volver a construir el proyecto, hacemos clic en Yes.
- Copiamos el archivo core.jar dentro de la carpeta libs del proyecto, el archivo se encuentra en el sitio donde extrajimos el contenido del .zip dentro de la carpeta core.
- Convertimos el proyecto como librería para poder ser usado en nuestro proyecto.
- Una vez que se consiga volver librería el proyecto tendremos nuevos errores debido a los atributos de unas variables, si no aparecen aun los errores intenta limpiar el proyecto (Project>Clean...), esto porque tarde o temprano aparecerán y nos dará error justo en las estructuras switch de 3 clases lo único que hay que hacer es reemplazarlo por su equivalente en ifs, eso se lo puede hacer de forma automática para ello nos colocamos sobre los switch y presionamos Ctrl+1 (o Cmd+1 en Mac), tal como lo podemos ver aquí.
Con esas correcciones no deberíamos tener errores, aunque es probable que sigan apareciendo debido al nivel de API en la que esta el proyecto, ZXing es compatible desde la versión 2.1 para adelante, los posibles errores pueden ser:
- Errores en atributos en el archivo AndroidManifest.xml, para solucionarlo simplemente elimine las etiquetas.
Hasta el momento ya tenemos el proyecto como librería lista para su uso.
Integrar ZXing a un proyecto Android
La idea de poder integrar ZXing a nuestro proyecto es la de no tener que depender de la aplicación Barcode Scanner y hacer que nuestra aplicación sola capture los códigos.
1. Vamos a las propiedades de nuestro proyecto (si no se tiene uno, pues lo creamos), eso es Clic derecho en el proyecto luego Properties, nos vamos a la sección Android y en la parte inferior adicionamos una librería con el botón Add... y ahí aparecerá nuestra librería recién configurada, la seleccionamos y presionamos OK.
2. Pedimos permiso de usar la cámara en el AndroidManifest.xml.
3. Registramos una activity en el AndroidManifest.xml la que usaremos de la librería, dentro del AndroidManifest.xml colocar las siguientes lineas donde están las activities, no olvidar cambiar la parte que dice "nombre.de.mi.paquete.SCAN" por el nombre de nuestro paquete seguido del .SCAN.
<activity
android:name="com.google.zxing.client.android.CaptureActivity"
android:clearTaskOnLaunch="true"
android:configChanges="orientation|keyboardHidden"
android:screenOrientation="landscape"
android:stateNotNeeded="true"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:windowSoftInputMode="stateAlwaysHidden" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<action android:name="nombre.de.mi.paquete.SCAN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
4. Tenemos de des-habilitar el menú de la activity que estamos usando de la librería, ya que es una activity ajena a nuestra aplicación, para ello nos dirigimos a la clase CaptureActivity.java de la librería que esta en el paquete com.google.zxing.client.android y comentamos los siguientes métodos para que no funcionen.
2. Importar el proyecto que esta dentro de la carpeta "android" (es la aplicación Barcode Scanner) del archivo que extrajimos, como se lo muestra en el gráfico.
3. Corregimos errores que se presentan al importar el proyecto.
- Cambiamos la versión del compilador Java, Eclipse por defecto lo mantiene en 1.5 y el proyecto esta escrita en 1.6, para ello clic derecho en el proyecto y luego Properties, ir al apartado de Java Compiler luego cambiar la opción de Compiler compliance level a 1.6, clic en OK, posteriormente nos pedirá si deseamos volver a construir el proyecto, hacemos clic en Yes.
- Copiamos el archivo core.jar dentro de la carpeta libs del proyecto, el archivo se encuentra en el sitio donde extrajimos el contenido del .zip dentro de la carpeta core.
- Convertimos el proyecto como librería para poder ser usado en nuestro proyecto.
- Una vez que se consiga volver librería el proyecto tendremos nuevos errores debido a los atributos de unas variables, si no aparecen aun los errores intenta limpiar el proyecto (Project>Clean...), esto porque tarde o temprano aparecerán y nos dará error justo en las estructuras switch de 3 clases lo único que hay que hacer es reemplazarlo por su equivalente en ifs, eso se lo puede hacer de forma automática para ello nos colocamos sobre los switch y presionamos Ctrl+1 (o Cmd+1 en Mac), tal como lo podemos ver aquí.
Con esas correcciones no deberíamos tener errores, aunque es probable que sigan apareciendo debido al nivel de API en la que esta el proyecto, ZXing es compatible desde la versión 2.1 para adelante, los posibles errores pueden ser:
- Errores en atributos en el archivo AndroidManifest.xml, para solucionarlo simplemente elimine las etiquetas.
Hasta el momento ya tenemos el proyecto como librería lista para su uso.
Integrar ZXing a un proyecto Android
La idea de poder integrar ZXing a nuestro proyecto es la de no tener que depender de la aplicación Barcode Scanner y hacer que nuestra aplicación sola capture los códigos.
1. Vamos a las propiedades de nuestro proyecto (si no se tiene uno, pues lo creamos), eso es Clic derecho en el proyecto luego Properties, nos vamos a la sección Android y en la parte inferior adicionamos una librería con el botón Add... y ahí aparecerá nuestra librería recién configurada, la seleccionamos y presionamos OK.
2. Pedimos permiso de usar la cámara en el AndroidManifest.xml.
3. Registramos una activity en el AndroidManifest.xml la que usaremos de la librería, dentro del AndroidManifest.xml colocar las siguientes lineas donde están las activities, no olvidar cambiar la parte que dice "nombre.de.mi.paquete.SCAN" por el nombre de nuestro paquete seguido del .SCAN.
<activity
android:name="com.google.zxing.client.android.CaptureActivity"
android:clearTaskOnLaunch="true"
android:configChanges="orientation|keyboardHidden"
android:screenOrientation="landscape"
android:stateNotNeeded="true"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:windowSoftInputMode="stateAlwaysHidden" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<action android:name="nombre.de.mi.paquete.SCAN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
4. Tenemos de des-habilitar el menú de la activity que estamos usando de la librería, ya que es una activity ajena a nuestra aplicación, para ello nos dirigimos a la clase CaptureActivity.java de la librería que esta en el paquete com.google.zxing.client.android y comentamos los siguientes métodos para que no funcionen.
- onCreateOptionsMenu(Menu menu)
- onPrepareOptionsMenu(Menu menu)
- onOptionsItemSelected(MenuItem item)
5. El nombre de nuestra aplicación usa el nombre de la aplicación de la librería, para solucionar eso simplemente podemos crearnos una nueva cadena en el archivo res/values/strings.xml con otro nombre de variable y nuestro nombre, por ejemplo:
Luego ponemos esa cadena como nombre de nuestra aplicación en el archivo AndroidManifest.xml.
6. Si nosotros ademas de nuestra aplicación tuviéramos instalado en nuestro dispositivo el Barcode Scanner u otro cada que queramos obtener un código nos dará la opción de seleccionar con que aplicación deseamos capturar, eso es algo molesto pues ya tenemos nuestra aplicación para que haga eso, para que no aparezca el dialogo con las opciones y use directamente la nuestra haremos lo siguiente:
<string name="nombre_app">Mi Aplicación</string>
Luego ponemos esa cadena como nombre de nuestra aplicación en el archivo AndroidManifest.xml.
6. Si nosotros ademas de nuestra aplicación tuviéramos instalado en nuestro dispositivo el Barcode Scanner u otro cada que queramos obtener un código nos dará la opción de seleccionar con que aplicación deseamos capturar, eso es algo molesto pues ya tenemos nuestra aplicación para que haga eso, para que no aparezca el dialogo con las opciones y use directamente la nuestra haremos lo siguiente:
- Dentro del archivo Intents.java del paquete com.google.zxing.client.android de la librería, buscamos el valor del primer String ACTION (de la clase Scan), cambiamos el valor de "com.google.zxing.client.android.SCAN" por "nombre.de.mi.paquete.SCAN" (nombre del paquete de nuestra aplicación).
- Dentro del archivo AndroidManifest.xml de la librería cambiar el valor del nombre del atributo action del intent-filter, cambiamos el valor de "com.google.zxing.client.android.SCAN" por "nombre.de.mi.paquete.SCAN" (nombre del paquete de nuestra aplicación).
Con eso ya tenemos configurada nuestra aplicación y ya podemos usarla sin ningún problema.
Leer códigos con ZXing
Una vez configurada la librería e integrada con nuestro proyecto el modo de uso es sencillo, cuando se quiera llamar a la pantalla de captura se lo hace de la siguiente forma:
Intent intent = new Intent("nombre.de.mi.paquete.SCAN");
startActivityForResult(intent, 0);
Leer códigos con ZXing
Una vez configurada la librería e integrada con nuestro proyecto el modo de uso es sencillo, cuando se quiera llamar a la pantalla de captura se lo hace de la siguiente forma:
Intent intent = new Intent("nombre.de.mi.paquete.SCAN");
startActivityForResult(intent, 0);
Opcional mente se puede mandar un extra para especificar que tipo de código leeremos, por ejemplo si queremos leer solamente códigos QR.
intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
Para obtener los resultados obtenidos después de capturar, dentro de la activity en donde estamos manejando.
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == 0) {
if (resultCode == RESULT_OK) {
String contenido = intent.getStringExtra("SCAN_RESULT");
String formato = intent.getStringExtra("SCAN_RESULT_FORMAT");
// Hacer algo con los datos obtenidos.
} else if (resultCode == RESULT_CANCELED) {
// Si se cancelo la captura.
}
}
}
Con eso ya podemos usar la librería ZXing para capturar códigos, el siguiente paso es generar códigos que también se lo puede hacer con esta fantástica librería.
Generar códigos con ZXing
Para poder generar un código QR y mostrarla en otra Activity solamente hay que hacer uso de un Intent, sin realizar otras configuraciones
Intent intent = new Intent("com.google.zxing.client.android.ENCODE");
intent.putExtra("ENCODE_TYPE", "TEXT_TYPE");
intent.putExtra("ENCODE_DATA", "Hola ZOMWI!!!");
startActivity(intent);
Lo que hará este código es mostrar en otra activity la imagen del código QR generado que almacena el texto "Hola ZOMWI!!!".
Podemos reemplazar el tipo de QR colocando en vez de "TEXT_TYPE", EMAIL_TYPE, PHONE_TYPE, SMS_TYPE u otro colocando su respectivo dato para la generación.
Cualquier duda o consulta pueden hacerla en los comentarios, estaré gustoso en responder si desean mas ejemplos o algo concreto.
Super, gracias
ResponderEliminarAlguien me puede mostrar como queda el codigo completo del AndroidManifest, por alguna razòn no me sale siempre me detiene la app
Eliminarhola como puedo generar la libreria al descargar zxing2.2 y luego su core.jar lo genero pero al momento de usarlo en un proyecto me sale en rojo cuando le doy agregar libreria osea primero le doy agregar libreria se ve todo normal pero luego voy a propiedades denuevo y sale con rojo lo estoy generando mal?? lo mismo me sucede con el zxing2.0 a alguien le sucedio lo mismo o que estoy haciendo ma l??? agradeceria la ayuda por favor :)
EliminarDescubri el problema :yo no cambiaba el nombre de mi proyecto osea mi proyecto teneia el mismo identificador que la libreria osea el nombre_app se debe cambiar en el proyecto que usara la libreria :)
EliminarAmigo, podrías facilitarme la librería, por favor, no consigo solucionar los errores.
Eliminarnecesito ayuda en esta parte Intent intent = new Intent("com.google.zxing.client.android.ENCODE");
Eliminarpara generar el código por mi propia aplicación se bloquea que puedo hacer ya declare en el manifiest la activity necesito ayuda :3 Gracias por su colaboración.
Increíblemente es por mucho la guía mas especifica que he encontrado para adherir la librería de la cebra cruzada. Gracias por tomarte el tiempo de redactarla de esta manera.
ResponderEliminarEste comentario ha sido eliminado por el autor.
ResponderEliminarEste comentario ha sido eliminado por el autor.
ResponderEliminarBuenas, muchas gracias por el tutorial. La parte de lectura de códigos me funciona de perlas, pero en la generacion me da problemas. Lo intento de la siguiente manera:
ResponderEliminarfinal Button button2 = (Button) findViewById(R.id.botongenera);
button2.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
EditText texto= (EditText) findViewById(R.id.textogenera);
CharSequence dimelo=texto.getText();
Intent intent2 = new Intent("com.google.zxing.client.android.ENCODE");
intent2.putExtra("ENCODE_TYPE", "TEXT_TYPE");
intent2.putExtra("ENCODE_DATA",dimelo );
startActivity(intent2);
}
});
Alguna idea de que es lo que falla?. Gradcias y un saludo
tengo el mismo problema. Al darle al boton de generar la aplicación se congela y se sale. Lograste ver donde está el error?
EliminarBuenas, busqué esto por 4 días y finalmente llegué a tu post. La verdad me sirvió montones, te lo agradezco muchísimo :)
ResponderEliminarSaludos desde Chile!
Saludos,
ResponderEliminarAmigo muchas gracias. Estoy empezando con el tema y tengo la duda de como usar el emulador de Eclipse para probar el escaneo. Me sale una barra verde que no logro entender. Si me puedes dar una guia o si es posible escanear una foto que tenga un codigo QR dentro del PC. :) xDDD
Gracias viejo, tu blog es un poco complejo, casi que no logro postear ^^
Slds,
Y otro punto. Que opinion les merece los comentarios del autor de Zxing sobre el uso de su app completa dentro de otra?
ResponderEliminarEste ejemplo seria algo asi??? o al usarlo como libreria no tendremos problemas, igual la GUI es la de nuestra app:
Sean Owen permalink
I appreciate the good intent you have in creating this tutorial. We encourage reuse of the project code to create more, better barcode apps. However as an author of the project, I must tell you we strongly discourage the level of copying you are encouraging here. Please do *not* tell people to copy our UI wholesale — this even violates trademark law in the US, and generates support email to us since people think they’re using our app. It also generates problems when people copy our manifest and suddenly try to respond to Intents intended for Barcode Scanner, but break it.
Please reconsider what you are encouraging people to do. Instead: show people how to integrate the core decoding inside an *original* app.
Slds,
Hola:
ResponderEliminarGracias por el tutorial, me está resultando muy útil. Sin embargo me he quedado atascada en obtener la información del código QR para poder utilizarla luego en mi programa. La sentencia:
String contenido = intent.getStringExtra("SCAN_RESULT");
Da un error en el programa ¿Alguien sabe por qué?
Gracias
Sinceramente me parecio la manera mas sencilla de poder utilizar la libreria... gracias por dedicar una parte de tu tiempo para publicar un ejemplo detallado (y)
ResponderEliminarSinceramente me parecio la manera mas sencilla de poder utilizar la libreria... gracias por dedicar una parte de tu tiempo para publicar un ejemplo detallado (y)
ResponderEliminar3. Corregimos errores que se presentan al importar el proyecto. (como los corregimos).
ResponderEliminarEsta pidiendo "import com.google.zxing. *"; (todo estos archivos se encentran en /Core) Todos los errores son porque no ecnuentra los archivos que se encuentran en esa carpeta
Bueno ya pude solucionar los problemas de la librería (con ant y proguard). Ahora el problema me salta es al querer llamar al activity de captura desde otra aplicación. Me esta dando un puntero a null. Alguien tuvo este problema???
ResponderEliminarjava.lang.RuntimeException: Unable to resume activity {com.argeniss.zxingdemov2/com.google.zxing.client.android.CaptureActivity}: java.lang.NullPointerException
Cualquier idea es bienvenida.
Buen dia, disculpen alguien sabe como usar zxing2.2 en vez de 2.0?? me he bajado el core para ese, ya que no viene incluido, pero no he podido
ResponderEliminarHola, sabes que necesito un codigo que me lea un codigo de barra y luego ese lo consulte a una base de datos y me diga si existe o no. Tienes alguno disponible que me puedas facilitar o indicarme como lo puedo obtener. Lo necesito para un proyecto de la U.
ResponderEliminarMuchas Gracias
Buenas, tengo un problema con el GalaxyS3, que cuando abro la aplicación scanner embebida el "scaner" que abre tiene poca resolución, el rectangulo es más chico que el GalaxyS2, no se si me explico bien?, o sea solo me pasa con el GalaxyS3 ya que con otros celulares el scanner se abre correctamente. Debe haber una flag para setear la calidad del scanner...
ResponderEliminarNo el logrado tomar los datos que realiza al encontrar al scanear el código puesto que me despliega todavia los botones de la app scan barcode que es visit web, send by email, y send by sms, como podría saltearme este paso, no se puede cambiar tambien el tamaño del cuadro para scanear ya que me sale bastante grande,
ResponderEliminarHola a todos, gracias por este aporte del colega zomwi, siempre se agradece.
ResponderEliminarOs dejo esta url, que he utilizado para incoporar zxing a mi app de forma nativa. Ha sido muy simple su uso.
http://wahidgazzah.olympe.in/integrating-zxing-in-your-android-app-as-standalone-scanner/
En resumen,
1- ha sido bajarme la version zxing 2.3.0. y descomprimirla
2- Creame un proyecto android por default.
3- A continaucion seguir los pasos de que carpetas/archivos debo copiarme a mi proyecto desde zxing y cuales mezclar si procede.
4- Corregir errorcillos (cambiar referencias de imports)
5- Completar el codigo para invocar y procesar los intent de zxing
6- ir a para copiar elementos que deben agregarse al manifiesto.
A saber:
- deben estar definidos estos permisos
uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"
uses-permission android:name="android.permission.INTERNET"
uses-permission android:name="android.permission.CAMERA"
- eliminar dle codigo copiado la parte que identifica como actividad main y launch.
7- fin
suerte !
Como puedo hacer para generar un codigo de barras normal?
ResponderEliminarHola a todos, alguien me puede colaborar con un ejemplo, trate de seguir los pasos acá mencionados, la aplicación se abre pero cuando trato de hacer lectura no me muestra la activity para capturar el código. gracias....
ResponderEliminarhOLA a todos, he visto que se puede generar una codigo qr de tipo credencial, mi pregunta es puedo agregar mas campos a ese tipo credencial o esta limitado
ResponderEliminar