Ir al contenido principal

Leer y generar códigos con ZXing

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.
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


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)

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.
  • 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:

<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);

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.





Comentarios

  1. Respuestas
    1. Alguien me puede mostrar como queda el codigo completo del AndroidManifest, por alguna razòn no me sale siempre me detiene la app

      Eliminar
    2. hola 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 :)

      Eliminar
    3. Descubri 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 :)

      Eliminar
    4. Amigo, podrías facilitarme la librería, por favor, no consigo solucionar los errores.

      Eliminar
    5. necesito ayuda en esta parte Intent intent = new Intent("com.google.zxing.client.android.ENCODE");
      para 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.

      Eliminar
  2. 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.

    ResponderEliminar
  3. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  4. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  5. Buenas, 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:

    final 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

    ResponderEliminar
    Respuestas
    1. tengo el mismo problema. Al darle al boton de generar la aplicación se congela y se sale. Lograste ver donde está el error?

      Eliminar
  6. Buenas, busqué esto por 4 días y finalmente llegué a tu post. La verdad me sirvió montones, te lo agradezco muchísimo :)
    Saludos desde Chile!

    ResponderEliminar
  7. Saludos,

    Amigo 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,

    ResponderEliminar
  8. Y otro punto. Que opinion les merece los comentarios del autor de Zxing sobre el uso de su app completa dentro de otra?

    Este 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,

    ResponderEliminar
  9. Hola:

    Gracias 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

    ResponderEliminar
  10. 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)

    ResponderEliminar
  11. 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)

    ResponderEliminar
  12. 3. Corregimos errores que se presentan al importar el proyecto. (como los corregimos).
    Esta 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

    ResponderEliminar
  13. 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???

    java.lang.RuntimeException: Unable to resume activity {com.argeniss.zxingdemov2/com.google.zxing.client.android.CaptureActivity}: java.lang.NullPointerException

    Cualquier idea es bienvenida.

    ResponderEliminar
  14. 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

    ResponderEliminar
  15. Hola, 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.

    Muchas Gracias

    ResponderEliminar
  16. 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...

    ResponderEliminar
  17. No 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,

    ResponderEliminar
  18. Hola a todos, gracias por este aporte del colega zomwi, siempre se agradece.

    Os 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 !

    ResponderEliminar
  19. Como puedo hacer para generar un codigo de barras normal?

    ResponderEliminar
  20. Hola 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....

    ResponderEliminar
  21. hOLA 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

Publicar un comentario

Entradas populares de este blog

Convertir un árbol n-ario a binario

Un árbol es una estructura de datos muy importante en el mundo de la programación, sin embargo el tipo de árbol que se usa comúnmente por sus propiedades es el árbol binario (árbol donde cada nodo tiene a lo máximo 2 nodos descendientes o nodos  hijo). Es muy natural definir arboles n-arios (arboles donde los nodos pueden tener cualquier cantidad de hijos) y para usar las propiedades de los arboles binarios hacer la respectiva conversión. Ver en nuevo sitio Si tenemos como inicio al siguiente árbol n-ario, el algoritmo de conversión es muy sencillo y se explicara gráficamente a continuación: Empezamos por la raíz, la raíz sigue siendo la misma para el árbol binario, a continuación el hijo mas de la izquierda de la raíz para a ser hijo inmediato izquierdo de la raíz y los demás hijos de la raíz se van colocando por orden. El segundo hijo de la raíz pasa a ser hijo derecho del primer hijo, y asi sucesivamente con los demás hijos que pasan a ser hijos derechos siempr

La mejor opción para descargar vídeos de Youtube, Vimeo y otros

Para descargar vídeos de Youtube y otras paginas siempre hemos tenido múltiples opciones, desde copiar archivos temporales del navegador que eran los vídeos en formato FLV, programas de escritorio que descargaban en flv y luego lo convertirla a cualquier formato y servicios web que te ofrecían descargas, múltiples opciones pero ahora mostraremos una de las mejores sino la mejor. Keepvid es una aplicación web que descarga videos de paginas de Youtube , Vimeo , Blip  y muchos otros, entre las características, es que es gratuito, nada de registrarse, dos clics para descargar un vídeo, múltiples formatos de vídeo, FLV, MP4, WebM, si esta disponible en HD y Full HD y también si deseamos solo audio podemos descargar en formato MP3, una de las desventajas (si se puede llamar así) es que usa Java para descargar los vídeos, es decir necesitamos tener Java instalado para el explorador, casi no un problema pues probablemente ya lo tenemos instalado o sino lo instalamos en algunos minutos. La