Como hacer un lector de códigos con Android Nativo

Android Developers Lector de Codigo

En este tutorial vamos aprender hacer un lector de códigos con Android y ZXing.

Lo primero que vamos hacer es crear un proyecto en Android Studio llamado (prueba lector códigos) si no sabes cómo mira el tutorial de crear nuevo proyecto en Android Studio.

Una vez creado el proyecto vamos construir la interfaz principal y para ello vamos a modificar el fichero del Layout principal el cual se ubica con el nombre activity_main.xml.

Android Developers class Activity_main

En este xml vamos a definir un Botón y 2 TextView

   
 
 
 

 

Android Developers Activity_main

Listo ya tenemos el botón para ejecutar el Scan del código y los textView donde vamos a mostrar la información capturada. Ahora vamos a agregar la librería de ZXing esta librería es open-source y es la que nos permite el procesamiento de códigos de barra en 1D y 2D, lo que vamos hacer es:

1. Crear un nuevo paquete con el nombre “com.google.zxing.integration.android” para ello hacemos click derecho sobre la carpeta src, y escogemos New o Nuevo, y luego Package o Paquete y en la ventana flotante colocamos como nombre del paquete (ver imagen siguiente).

Android Developers com.google.zxing.integration.android

2. Ahora lo que vamos hacer es crear dos clases sobre el paquete que acabamos de crear, para ello haces click derecho sobre el paquete y eliges New o Nuevo, y luego Class o Clase. La primera clase la llamamos IntentIntegrator y a la segunda le ponemos IntentResult.

Android Developers IntentIntegrator  y IntentResult

Lo siguiente que tienes que hacer es remplazar el código de las clases por el que te dejo a continiación. (IntentIntegrator y IntentResult)

Ahora que tienes las dos nuevas clases, ya puedes importarla a tu fichero de MainActivity.java que es donde la utilizaremos para ello emplea el siguiente trozo de código después de la sentencia package..:

 

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

Listo ahora manos a darles funcionamiento a los botones y a integrar las clases de ZXing en nuestro proyecto.

1. Lo primero que vamos hacer es después de public class MainActivity extends ActionBarActivity { , vamos a colocar lo siguiente

 private Button scanBtn;
 private TextView formatTxt, contentTxt;

Si al colocar el código te sale en rojo es porque no has importado las clases necesarios, eso lo resuelves dando click sobre la parte roja y oprimiendo la tecla Alt y enter, esto te dará la opción de importar las clase necesario.

2. El siguiente código lo vamos a colocar dentro de la función protected void onCreate despues de setContentView(R.layout.activity_main);

 
 //Se Instancia el botón de Scan
        scanBtn = (Button)findViewById(R.id.scan_button);
        //Se Instancia el Campo de Texto para el nombre del formato de código de barra
                formatTxt = (TextView)findViewById(R.id.scan_format);
        //Se Instancia el Campo de Texto para el contenido  del código de barra
                contentTxt = (TextView)findViewById(R.id.scan_content);
        //Se agrega la clase MainActivity.java como Listener del evento click del botón de Scan
                scanBtn.setOnClickListener(this);


Como con el código nos va a salir un error lo vamos a solucionar agregando a public class MainActivity extends ActionBarActivity { el implements View.OnClickListener quedando de esta forma public class MainActivity extends ActionBarActivity implements View.OnClickListener {

esto nos arroja otro error y es porque no hemos implementado el método de OnClickListener eso lo solucionamos agregando esta función

 
 @Override
    public void onClick(View view) {
        //Se responde al evento click
        if(view.getId()==R.id.scan_button){
            //Se instancia un objeto de la clase IntentIntegrator
            IntentIntegrator scanIntegrator = new IntentIntegrator(this);
            //Se procede con el proceso de scaneo
            scanIntegrator.initiateScan();
        }
    }

Android Developers codigo MyActivity

Listo por ultimo vamos a recuperar los datos en el textView agregamos la siguiente función justo después de la función del OnClick

 
 public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        //Se obtiene el resultado del proceso de scaneo y se parsea
        IntentResult scanningResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
        if (scanningResult != null) {
            //Quiere decir que se obtuvo resultado pro lo tanto:
            //Desplegamos en pantalla el contenido del código de barra scaneado
            String scanContent = scanningResult.getContents();
            contentTxt.setText("Contenido: " + scanContent);
            //Desplegamos en pantalla el nombre del formato del código de barra scaneado
            String scanFormat = scanningResult.getFormatName();
            formatTxt.setText("Formato: " + scanFormat);
        }else{
            //Quiere decir que NO se obtuvo resultado
            Toast toast = Toast.makeText(getApplicationContext(),
                    "No se ha recibido datos del scaneo!", Toast.LENGTH_SHORT);
            toast.show();
        }
    }



Android Developers onActivityResult

AndroidManifest.xml

 
 


    
        
            
                

                
            
        
    






Listo solo nos queda probarlo.

Android Developers Lector de codigo

Comentarios

  1. Esta súper fácil pensé que era un poco más difícil gracias por compartir tu conocimiento

    ResponderEliminar
  2. Gracias por publicar estos tutoriales que nos facilitan el aprendizaje en Android muy buen tutorial.

    ResponderEliminar
  3. y como hago uno sin usar aplicaciones de terceros, que la misma aplicación lea el codigo qr, sin necesidad de utilizar barcode scanner

    ResponderEliminar
  4. Oye y donde está el código de las clases IntentIntegrator y IntentResult??

    ResponderEliminar
    Respuestas
    1. IntentIntegrator.java: https://drive.google.com/open?id=0B4Eymb-1CUjDTk1vZUJVRTRoRGs&authuser=0


      IntentResult.java: https://drive.google.com/open?id=0B4Eymb-1CUjDRlZBUU9UTmhPMWc&authuser=0

      Eliminar
    2. Excelente tutorial funciono a la primera Gracias

      Eliminar
  5. que permisos necesito en el manifest para que funcione. Gracias esta muy bien el tutorial

    ResponderEliminar
    Respuestas
    1. para la lectura del código no necesitas permisos, si estas haciendo algo especifico como guardar el dato en una base de datos si. sin embargo te doy el código del manifest para que lo compares.

      Eliminar
  6. Gracias por el tutorial, muy bueno! para guardar la informacion recogida en alguna base de datos, necesito permisos?

    ResponderEliminar
    Respuestas
    1. Los permisos que necesitas para guardar en una base de datos como mysql son de Internet, para que puedas enviar la información por get o post a un php que guarde en base de datos. el permiso es:

      uses-permission android:name="android.permission.INTERNET"

      Eliminar
    2. Hola ya he preparado un tutorial para MySQL con Android te comparte el Link http://www.hablemosdeandroid.com/2015/12/como-conectar-mysql-con-android.html

      Eliminar
  7. Gracias por el tutorial, muy bueno, disculpa pero donde esta el archivo manifest? podrias mostrarlo?

    ResponderEliminar
    Respuestas
    1. el archivo como tal no esta pero si el código. lo encuentras con el titulo de AndroidManifest.xml antes de la ultima imagen del tutorial.

      Eliminar
  8. Excelente, Llevaba Tiempo Buscando Un TuTo Que Sirviera Y El Tuyo El Prefecto (y)

    ResponderEliminar
  9. Excelente tutorial, viene todo perfectamente explicado.

    La única duda es que al añadir la función "onActivityResult" al final, me da un error con "Intent" y "Toast" de que no puede resolverlo. Se sabe qué podría ser?

    Muchas gracias, me está siendo muy útil.

    ResponderEliminar
    Respuestas
    1. Que tipo de error es el que te arroja

      Eliminar
    2. Hola de nuevo, lo acabo de solucionar añadiendo las librerías android.widget.Toast android.content.Intent

      Ahora el problema me lo da al depurar, en el .xml con las órdenes:

      android:layout_centerhorizontal="true"
      android:text="Scan">

      android:textisselectable="true"
      android:layout_centerhorizontal="true"

      android:textisselectable="true"
      android:layout_centerhorizontal="true"

      me dice que el atributo es desconocido. Utilizo la versión de android studio 1.2.2

      Muchas gracias por contestar tan rápido

      Eliminar
    3. Andrés, que pena con tigo lo que pasa esque el plugin que he estado utilizando para mostras el codigo esta colocando todo el minuscula por favor compara el codigo del xml con la imagen que esta mas abajo del mismo. vas ha encontras que hay unos errorres tales como

      android:layout_centerhorizontal="true"
      android:text="Scan">

      deberia ser

      android:layout_centerHorizontal="true"
      android:text="Scan">

      prueba y me cuentas si te funciono.

      Eliminar
    4. Eso era. Todo solucionado.

      Muchísimas gracias!!

      Eliminar
  10. Hola, fantástico el tutorial, me ha ayudado mucho a iniciarme.

    Sólo una cuestión: si pulso en el botón escanear y accedo a la app Barcode scanner, y le doy atrás sin escanear ningún código, la aplicación se cierra de manera forzosa, hay alguna forma de solucionar esto?

    Un saludo y muchas gracias!!

    ResponderEliminar
    Respuestas
    1. Hola Andrés estuve revisando el tutorial y cuando se pulsa el botón atrás, debería estar arrojando null. Si se esta cerrando de manera forzosa hay algún error al retornar el resultado deberías revisar el error que arroja.

      Eliminar
    2. Hola, muchas gracias por contestar. Podrías decirme, dónde debería retornar null, por si algo se me escapó en mi código? O por consiguiente, dónde podría ver el error que arroja, si hay algún log o algo dónde se registre, ya que sólo me sale el mensaje de que la aplicación se detuvo.

      Un saludo y gracias de nuevo.

      Eliminar
    3. El null retorna cuando no se escanea nada esta en:

      public void onActivityResult(int requestCode, int resultCode, Intent intent) {
      //Se obtiene el resultado del proceso de scaneo y se parsea
      IntentResult scanningResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
      if (scanningResult != null) {
      //Quiere decir que se obtuvo resultado pro lo tanto:
      //Desplegamos en pantalla el contenido del código de barra scaneado
      String scanContent = scanningResult.getContents();
      contentTxt.setText("Contenido: " + scanContent);
      //Desplegamos en pantalla el nombre del formato del código de barra scaneado
      String scanFormat = scanningResult.getFormatName();
      formatTxt.setText("Formato: " + scanFormat);
      }else{
      //Quiere decir que NO se obtuvo resultado
      Toast toast = Toast.makeText(getApplicationContext(),
      "No se ha recibido datos del scaneo!", Toast.LENGTH_SHORT);
      toast.show();
      }
      }


      los errores de código deberían salir en la consola donde estas ejecutando la app, si estas utilizando Android Studio en la parte inferior de la pantalla se activa la consola de respuesta y los errores salen en rojo.

      Eliminar
    4. Muchas gracias, creo que ya sé lo que tengo mal.

      Un saludo y gracias por la ayuda!!

      Eliminar
  11. Hola de nuevo, no he dejado ningún correo de contacto, porque pensaba que los comentarios eran públicos.
    Si puedieran darme una solución de como hacer que la aplicación vuelva atrás sin cerrarse de forma forzosa al entrar en el barcode scanner, se lo agradecería muchísimo.

    Correo: siete.andres@gmail.com

    Un saludo y gracias de antemano!

    ResponderEliminar
  12. hola donde se agregar la librería de ZXing le do clic de derecho a src y no me aparece agregar libreria

    ResponderEliminar
    Respuestas
    1. debes Crear un nuevo paquete con el nombre “com.google.zxing.integration.android”, como dice el punto 1 del tutorial

      Eliminar
  13. En el MainActivity.java me marcan muchos errores

    setContentView(R.layout.activity_main);-------------------en donde viene R me marca en rojo y es asi en todas las lineas

    ResponderEliminar
    Respuestas
    1. realmente no se que problema te este generando el tutorial pues, el error que me comentas esta asociado a los recursos que utiliza android para trabajar, la Class R,java se generado automáticamente por el compilador. y no te la esta reconociendo. Te recomiendo copilar el proyecto y me digas el error que este arroja, muchas de la veces el error muestra la solución al problema.

      Eliminar
  14. la classR.java me marca error en rojo

    ya compile el programa abrio una pestaña v12\values-v21.xml
    en esta pestaña me marca muchos errores
    style name="Base.TextAppearance.AppCompat" parent="android:TextAppearance.Material"/>

    ResponderEliminar
  15. Hola que tal!!
    Buen tutorial, me ha servido mucho, aunque tengo una duda, como se podria enlazar a una base de datos, no se, si se pueda, que el qr, de un enclace para descargar archivos multimedia, de una base de datos.
    Buen dia!!

    ResponderEliminar
    Respuestas
    1. Hola Memo, claro que si es posible hay que trabajarlo con php y la comunicación va por medio de el metodo POST o GET y para esto tienes que utilizar HttpGet y HttpClient en el java, yo creo que en estos días publicare un tutorial del tema.

      Eliminar
    2. Hola Meme he preparado un tutorial de Como conectar MySQL con Android de comparto el LINK http://www.hablemosdeandroid.com/2015/12/como-conectar-mysql-con-android.html

      Eliminar
  16. Hola tiene que tener instalado alguna aplicacion mas para que funcione???

    ResponderEliminar
  17. Hola buenos días, he seguido el tutorial paso por paso y cuando abro la aplicación se me cierra sola, alguien sabe porqué?
    Muchas gracias

    ResponderEliminar
    Respuestas
    1. Hola lumbreras14 tendrias que mirar en la consola de errores que error te está generando la app para que te de una idea de que estas haciendo mal, normalmente estos errores están en rojo

      Eliminar
    2. EL problema es que no me aparece ningún error, e incluso me deja generar el APK.

      Muchísimas gracias.

      Eliminar
  18. Ya esta solucionado fallo mio, igualmente muchas gracias, el ejemplo es muy bueno.

    Ya aprovecho : ¿Alguien sabe poner la cámara delantera en lugar de la traserá?

    ResponderEliminar
  19. Muchas gracias por tu aporte me sirvio perfecta la app... :D

    ResponderEliminar
  20. AMMM NO PASA nada al precionar el boton .-.

    ResponderEliminar
  21. Alguien sabe por que me tira error en "this" :P

    ResponderEliminar
  22. En donde esta el codigo de las clases IntentIntegrator e IntentResult????

    ResponderEliminar
    Respuestas
    1. Dentro del tutorial esta los link de descarga te adjunto los link de nuevo

      https://drive.google.com/open?id=0B4Eymb-1CUjDTk1vZUJVRTRoRGs&authuser=0
      https://drive.google.com/open?id=0B4Eymb-1CUjDRlZBUU9UTmhPMWc&authuser=0

      Eliminar
  23. Tengo una duda, cuando le das click al botón scan lo que hace es que redirige a la aplicación barcode scanner ?, si quisiera que se mostrara directamente un cuadro y en este te muestre lo que apunta la cámara y sobre este leer el código QR esta muy complicado?

    ResponderEliminar
  24. mil gracias, tus tutoriales son sorprendentes

    ResponderEliminar
  25. Muchisimas gracias. Todo explicado muy claro. Me ha funcionado a la primera. Copiar y pegar.
    Te reitero las gracias.

    ResponderEliminar
    Respuestas
    1. Muchas gracias por tus comentarios, esa es la idea de que todo quede claro y funcione

      Eliminar
  26. Hola que tal, quisiera saber si tendras alguna idea de hacer un scanner, pero desde cero, has visto que whatsapp tiene el suyo quisiera hacer uno propio desde cero sin depender de BardcodeScanner, espero tus repuestas gracias.

    ResponderEliminar
    Respuestas
    1. si puedes hacer uno utilizando la misma camara de tu smartphone..si quieres saber como enviame correo gladisconsultoramk@hotmail.com

      Eliminar
  27. Muchisimas gracias, me funciono bien,
    pero tuve inconvenientes con

    button android:layout_centerhorizontal="true" android:text="Scan"





    esas carateristicas me toco borrarselas y listo, quiza sea la nueva version de android yo tengo la 2.1.1

    perod el resto todo excelente

    mil y mil y mil gracias

    ResponderEliminar
  28. Buen tutorial, pero tengo un problema al darle al botón scan se detiene la aplicacion y me muestra ese error y no se a que se debe ya que en el codigo no hay errores


    FATAL EXCEPTION: main
    Process: com.example.karzak.ipharmacy, PID: 31336
    java.lang.NoSuchMethodError: No direct method (Landroid/app/Activity;)V in class Lcom/google/zxing/integration/android/IntentIntegrator; or its super classes (declaration of 'com.google.zxing.integration.android.IntentIntegrator' appears in /data/data/com.example.karzak.ipharmacy/files/instant-run/dex/slice-zxing-integration_b05e73b900685971cb153b2f685e7705845851c9-classes.dex)
    at com.example.karzak.ipharmacy.BuscarCodigoBarrasActivity.onClick(BuscarCodigoBarrasActivity.java:39)
    at android.view.View.performClick(View.java:4808)
    at android.view.View$PerformClick.run(View.java:19918)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5608)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1397)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1192)


    --------- beginning of system

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

    ResponderEliminar
  30. Hola excelente tutorial pero sabras como hacer un codificador de qr desde cero en Android estudio, que no depende aplicaciones de terceros como el barcode scanner? te lo agradeceria no si hay forma con esta misma libreria de Zxing

    ResponderEliminar
  31. hola jhon excenlete tutorial, pero mira que me sale el siguiente error

    Gradle build finished with 13 error(s) in 9s 281ms

    ResponderEliminar
    Respuestas
    1. hola fabian tienes problemas con el Gradle mira, en la consola de errores tiene que mirar el error tal vez solo tengas que cambiar la versión

      Eliminar
  32. Hola men, gracias por el buen tutorial lo que me sucede es lo siguiente, yo quiero que scanee el codigo como lo esta haciendo la aplicacion pero quiero que me aparezca el precio del producto no se si se pueda o si me entiendas, porque como ves tu aplicacion muestra un numero que es el contenido y ese contenido es el mismo numero que tiene la barra que acabamos de scanear y esta bien pero lo que quiero es que me aparezca el precio como tal del producto se puede o no se puede por favor respondeme muchas gracias buen tutorial

    ResponderEliminar
    Respuestas
    1. Hola KRLIITOS, lo que quieres hacer lo logras haciendo la relación del código con una base de datos en donde tengas registrados los datos que desees mostrar del producto.

      Eliminar
    2. utiliza un REST, con Get (json) y POST a una URL de una pi

      Eliminar
  33. Excelente... nomas que me perdí en eso del Package o Paquete ahora en android studio 2 en vez de crear en la carpeta -src- ahora es en la capeta -java-

    ResponderEliminar
  34. Si podrías resubir las clases de los Intent's sería genial.

    ResponderEliminar
    Respuestas
    1. Hola Filosofía en base a la programación realmente sería genial pero tomará tiempo hacer reingeniería al código de las clases.

      Eliminar
  35. Hola Filosofía en base a la programación realmente sería genial pero tomará tiempo hacer reingeniería al código de las clases.

    ResponderEliminar
  36. Hola recién reviso este ejercicio pero no me deja abrir los archivos de los Intent me gustaría que alguien me los facilitara, ya que ninguna de los links que muestran abren todos arrojan error 404, agradecería que me los enviaran

    ResponderEliminar
  37. disculpen he probado ejemplo muy parecido y tros totalmente diferentes, tanto para android studio como visual studio, pero me marcan muchos errores, alguien puede ayudarme, con ejemplo sencillo que funcione en android estudio o visual studio actual

    ResponderEliminar

Publicar un comentario

Gracias por compartir tus comentarios con nosotros, si el comentario requiere de alguna respuesta por parte de nosotros, trataremos de responderte lo mas pronto posible.

Entradas populares de este blog

Como conectar MySQL con Android Nativo

Lista con imágenes Android nativo (ListView)

SUMAR RESTAR HORAS DÍAS EN ANDROID