jueves, 27 de octubre de 2011

zXing - Añadirlo a tu proyecto de Android

La base del tutorial la he sacado de aquí, aunque me surgieron algunos problemas más que no están comentados en ese, así que me he animado a hacer este.

Lo que se explica aquí esta probado para la revisión 2099 e inferiores del proyecto zXing, para versiones posteriores desconozco si funciona.

Obtener zXing

Puedes bájarte directamente (password zxing) el proyecto configurado (revisión del repositorio 2099 y el SDK con android 4.0).

Este proyecto tiene las mejoras de cambiar tamaño rectángulo cámara (simular cuadrado para QR), eliminar botón de menús y eliminar texto de estado para modo portrait, no elimina la pregunta de que aplicación usar. Bajalo desde la siguiente dirección, tendrás que importarlo desde eclipse creando un nuevo proyecto android desde un existing source.

http://www.hidelinks.com/?ghvw4k7r2q

Link alternativo

Y ve directamente a la sección de enlazar zXing con tu aplicación.

O sigue las siguientes instrucciones:

Como dice el tutorial anterior, lo primero es obtener el /core y /android del proyecto zXing, que son los que nos harán falta para usarlos en nuestra aplicación, para ello los descargamos desde el repositorio de svn de google code, tal y como explique en el anterior tutorial sobre la configuración de la librería.

Configuración como librería

Ahora bien, la cosa está en que necesitamos meter la parte de /android como un proyecto dentro de nuestro eclipse, y de la manera que explicamos antes no ocurre eso, sino que lo tenemos to ahí apegotonao en un proyecto llamado svn, pero podemos aprovecharlo! ¿Cómo? Muy fácil, copiando el proyecto de /android desde el explorador de Windows a otra carpeta, para tenerlo separado.

Una vez hecho eso, nos vamos al eclipse y elegimos crear un nuevo proyecto de android, escribimos en el nombre zXing por ejemplo, y elegimos la opción de crearlo desde un existing source y finish.
La cruz roja no os debería salir xD
Ahora con el proyecto creado pinchamos con botón derecho y elegimos team>disconnect y yes, para que nos limpie todo el tema de svn, que no nos interesa tenerlo molestando. Si no os da la opción de disconnect mejor, no teneis que hacer este paso xD.

Aparcamos nuestro proyecto eclipse recién creado y nos vamos a compilar el /core, para ello podemos hacer lo mismo que expliqué en el manual anterior de configuración, navegamos hasta la ruta del core y ant clean build-no-debug, o ant build export para versiones recientes y así tendremos nuestro core.jar.

A continuación nos vamos a configurar el build-path (pincha encima del proyecto con botón derecho>build path>configure build path)y le damos a añadir external jars y metemos el core.jar que acabamos de compilar.


Ahora pinchamos con botón derecho en el proyecto>propiedades>android y marcamos el checkbox de abajo que pone Is library. Porque vamos a usar nuestro proyecto como una librería.


Tras este paso, si no os da estos problemas, sois afortunados, porque a mi si que me los dio!

Solución algunos problemas

Primero, una opción en el manifest del proyecto, la de android:xlargeScreens="true", no sé porque me petaba el proyecto (por algo del SDK 2.2), así que coméntala si es necesario para que no de por culo.


Ahí no acaba la cosa, ahora tendrás un error al haber convertido el proyecto en librería, los cases de los switchs te darán error, ¿Por qué? Por esto, para arreglarlo situa el ratón encima de cada switch (thx zoack xd), y pulsa control+1, y elige la opción de convertir los switchs en ifs, y esto estará listo.

Añado un aporte que Juan Carlos hizo en los comentarios, si tras esto algunos @overrides te dan errores, prueba a bajar la versión de JDK a la 1.6.

Si te sigue dando algún error, elige Project>clean para que regenere el R.java y ya debería funcionar!

Enlazar zXing con tu proyecto

Hemos acabado de configurar la librería, ahora nos vamos a configurar nuestro proyecto de aplicación, asi que botón derecho>propiedades>android y abajo del todo elegimos la opción de add y debería aparecer nuestra librería zXing recién creada, la añadimos.

EDITO: Si no quieres importar la librería de esta manera, puedes hacer uso del archivo zxing.jar que te crea eclipse al compilarla, e importarlo como hacemos con el core.jar, con la opción de add externals jars, el zxing.jar lo encontraras en la carpeta /bin del proyecto zXing de eclipse.
Además también tenemos que añadir el core.jar al build-path, como hicimos con el proyecto de la librería zXing.

(Si has saltado a este paso directamente y estas usando mi proyecto subido, asegúrate de que en el proyecto de la librería zXing está el core.jar en el build-path y que en la sección de android esta marcado como Is Library )

Ahora en tu aplicación, que tu botón lance esto:

Intent intent = new Intent("com.google.zxing.client.android.SCAN");
intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
startActivityForResult(intent, 0);

Y el siguiente método para obtener los resultados desde la misma activity:

public void onActivityResult(int requestCode, int resultCode, Intent intent) {
   if (requestCode == 0) {
      if (resultCode == RESULT_OK) {
         String contents = intent.getStringExtra("SCAN_RESULT");
         String format = intent.getStringExtra("SCAN_RESULT_FORMAT");
         // Handle successful scan
      } else if (resultCode == RESULT_CANCELED) {
         // Handle cancel
      }
   }
}

Por ultimo tenemos que añadir en el manifest de tu aplicación la información sobre el SCAN de zXing, asi que pega esto:

<activity
            android:clearTaskOnLaunch="true"
            android:stateNotNeeded="true"
            android:configChanges="orientation|keyboardHidden"
            android:name="com.google.zxing.client.android.CaptureActivity"
            android:screenOrientation="landscape"
            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="com.google.zxing.client.android.SCAN" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
</activity>

Por último dale permisos a tu aplicación para usar la cámara con esto:
<uses-permission android:name="android.permission.CAMERA"></uses-permission>

Prueba a añadir también lo siguiente si la cámara te da problemas, no se abre, se cierra con error, etc, las primeras veces que lo use no me resulto necesario, pero la última vez que lo probé, con esto se me arreglaron los problemas.

<uses-feature android:name="android.hardware.camera" />
    <uses-feature
        android:name="android.hardware.camera.autofocus"
        android:required="false" />
    <uses-feature
        android:name="android.hardware.touchscreen"
        android:required="false" />
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="8" />

Bien, con esto ya lo tendrás funcionando pero hay 3 cosas que aún se pueden mejorar.

Mejoras extra

Primero, cuando pulses el botón de menú dentro del scanner, te aparece un menú de opciones, el cual si pulsas alguna opción petará, además el nombre de la aplicación del scanner sobreescribirá el tuyo, y por último cada vez que pulses el botón se te dará la opción de que aplicación usar para escanear el código, resultando un tanto molesto ¿Como arreglar estos problemas?

Para lo del menú, tan fácil como irnos al CaptureActivity.java del paquete com.google.zxing.cient.android y comentar 3 métodos, el onCreateOptionsMenu(Menu menu), el onPrepareOptionsMenu(Menu menu) y el onOptionsItemSelected(MenuItem item), con eso eliminaremos la función de menú.

Para lo del nombre, nos vamos a res/values/ y para los strings.xml cambiamos el string app_name por el de nuestra aplicación, eso deberíamos hacerlo para todas las carpetas values-xx, o borralas todas y dejar solo la de values..., según la gana que tengas xD.

Edito:

En principio la idea de tener varias values-xx, es para personalizar los distintos strings.xml en función del idioma del dispositivo, pero si solo quieres el nombre de tu aplicación o no te interesa traducir los textos a distintos idiomas, basta con tener tu values/strings.xml.

En la librería zXing sí usan este sistema de traducción, así que si quieres mantener tu nombre de aplicación para un dispositivo en español por ejemplo, tendrías que modificar el strings.xml de la values por defecto, y la de la values-es, pero si el dispositivo esta en inglés te seguiría saliendo lo de Barcode Scanner, por que pillaría el values-en/strings.xml.

Conclusión, si quieres que se mantenga para todas tienes 2 opciones, o borras todas las values-xx, como mencionó arriba, o modificas individualmente cada app_name de cada xml.

La ventaja de la primera, más rapidez, pero si usas algo más de librería zXing que pille un string del strings.xml, solo saldrá el que tengas (que por defecto es inglés), así que tu decides.

Para lo tercero tenemos que modificar 3 archivos, primero el Intents.java de com.google.zxing.client.android, cambiando el String ACTION de Scan com.google.zxing.client.android.SCAN a la de tu proyecto, por ejemplo, si tu proyecto esta en com.pepino.prueba, tendrás que ponerlo como com.pepino.prueba.SCAN, este mismo cambio hay que hacerlo en el nombre del intent-filter ACTION del manifest.xml de la librería de zXing y también en el de tu proyecto, NO CAMBIAR el nombre de la actividad asociada en el android:name. Y por supuesto ahora cuando llames al Intent de scaneo debes hacerlo con tu nuevo ACTION, es decir, com.pepino.prueba.SCAN.

Por cierto, si vais a leer códigos qr, quizás os interese modificar en com.google.zxing.client.android.camera la actividad CameraManager.java, el método getFramingRect(), la línea de:

int width = screenResolution.x * 3 / 4;

cambiando el 3 por un 2, así conseguiremos que el rectángulo que se forma para reconocer los códigos parezca más un cuadrado xD, un tanto cutre pero funciona.

Otra mejora interesante para los QRadictos, por defecto el layout de la cámara del zXing está hecho para que se use en modo landscape, pero si queremos por ejemplo leer solo códigos QR (como es mi caso), puede que nos interese ponerlo en modo portrait.

Tras investigar por la librería no encontré una manera rápida de hacer esto (por lo que tuve viendo requeriría bastante curro, si alguien encuentra una forma fácil que lo comente!), así que se me ocurrió a probar a leer un código directamente poniendo el móvil en forma portrait, aunque el layout sigue siendo landscape y... funciona igual!

Así que el único problema que tenía era el texto de estado que aparece a la izquierda, pero por suerte android tiene un setVisibility(), así que tan fácil como irnos al CaptureActivity.java, al método onCreate(Bundle icicle) y añadir justo debajo de la línea:

statusView = (TextView) findViewById(R.id.status_view);

la siguiente:

statusView.setVisibility(View.INVISIBLE);

Para la revisión 2099 y probablemente posteriores, esta línea hay que añadirla modificando el método resetStatusView(), donde pone a Visible el statusView, ponerlo a INVISIBLE, y listo.

En el método onCreate comenta la línea siguiente para evitar que lance la ayuda.

showHelpOnFirstLaunch();

Si queréis cambiarle el sonido al "obturador" de la cámara, para ello nos vamos al BeepManager.java al método buildMediaPlayer(Context activity) a la línea de :

AssetFileDescriptor file = activity.getResources().openRawResourceFd(R.raw.beep);//beep original 

Y cambiamos el R.raw.beep por nuestro sonido, que tenemos que haber puesto previamente en el directorio raw, y accedemos a él con R.raw.nombre, así de fácil tendremos nuestro sonido custom!

Errores Comunes

E/AndroidRuntime(848): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=com.google.zxing.client.android.SCAN

Estas lanzando el Intent del scanner con un nombre de ACTION incorrecto, que no se corresponde con el que aparece en el manifest de tu proyecto, en el de la librería zXing o en el de la clase Intents.java . Dicho ACTION debe ser igual en todos los sitios. Por defecto es "com.google.zxing.client.android.SCAN"

E/AndroidRuntime(946): java.lang.VerifyError: com.google.zxing.client.android.CaptureActivity

El core.jar que has importado al proyecto de tu aplicación no se corresponde con la versión de la librería zXing.

E/AndroidRuntime(1214): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.android.prueba/LINEAMODIFICADA.CaptureActivity}: java.lang.ClassNotFoundException: LINEAMODIFACADA.CaptureActivity in loader dalvik.system.PathClassLoader[/data/app/com.android.prueba-1.apk]

La línea del manifest de tu proyecto que indica que clase esta asociada al intent action que lanzas no esta bien configurada, debe ser esta: android:name="com.google.zxing.client.android.CaptureActivity". En el ejemplo de arriba el error sería LINEAMODIFICADA.

class-not-found-when-using-zxingz

Usando la tercera solución de este link, el compañero Rafa consiguió arreglarlo:
http://stackoverflow.com/questions/11959091/class-not-found-when-using-zxing
Explicación en ingles:
Your jar is not in the /libs folder. This happens when you have added the jar to the build path, but newer versions of ADT need it to be in /libs. Put it there and re-add it to the build path.

Un saludo!

148 comentarios:

  1. mi primer comentario spam, iba a borrarlo pero lo voy a dejar como recuerdo xD

    ResponderEliminar
  2. Muy muy bueno el tutorial!! La verdad es que me he pegado con los mismos errores yo sola, pero la última parte de consejos está muy bien, por que odiaba eso de tener que elegir la aplicación a usar =S

    ResponderEliminar
  3. Buenas,
    Muchas gracias por comentar y por los agradecimientos, la verdad es que me dio bastante jaleo poder incorporar la dichosa libreria en mi aplicacion aunque ha merecido la pena.
    Y la parte de consejos me parecio bastante interesante añadirla pprque mejoran bastante la integracion en tu propia aplicacion, seguramente se podran mejorar algunas cosas mas aunque ahora lo tengo algo dejao, asi k ya sabes si descubres algo interesante no dudes en comentarlo!

    X cierto n unos dias añadire cm modificar el sonido para cuando detecta un codigo, bastante sencillo y muy util!

    Un saludo

    ResponderEliminar
  4. Hola Jstyl_8, la verdad es que es un tutorial muy bueno pero por desgracia yo soy demasiado torpe y me sigue dando problemas jejeje, ¿serias tan amable de colgar el proyecto en un zip para poder bajarlo y asi ver donde tengo los fallos?
    Muchas gracias por tu trabajo y un saludo.

    ResponderEliminar
  5. Hola, anonimo xD

    Aqui os dejo el proyecto de eclipse de la librería, este es el que tenéis que usar en vuestra aplicación, seleccionandolo en la parte de propiedades>android>add

    http://www.megaupload.com/?d=3ZMZZ6EI

    Espero que os sea de utilidad.

    Un saludo.

    ResponderEliminar
  6. Jstyl_8, muy buen trabajo, me ha sido de mucha utilidad :D gracias!

    ResponderEliminar
  7. SALUDOS SOY DE ECUADOR ESTOY EMPEZANDO EN LA PROGRAMACIÓN ANDROID MUY BUENO EL POST COMO PODRIA AGREGARLE ESTE PROYECTO A UNA APLICACION EN ECLIPSE DONDE ESTE UN BOTON Y UN TEXTVIEW AL MOMENTO QUE PULSO EL BOTON LA CAMARA ME LEE EL CODIGO QR Y EN EL TEXTVIEW ME APARECE LO QUE LEE PODRIAN SER NUMEROS. ME AYUDARIAS MUCHO GRACIAS DE ANTEMANO.

    ResponderEliminar
  8. Buenas,

    No sé si te has leído la entrada pero está todo explicado en la misma, si no lo entiendes, mírate mejor algún tutorial de Android y luego vuélvete a pasar por aquí.

    Un saludo.

    PD: Evita las mayúsculas
    PD2:Mi primer hoygan!

    ResponderEliminar
  9. Muchas gracias, es un gran aporte.
    Quería comentar un problema que tengo,he creado mi proyecto,en el emulador funciona perfectamente, pero en el telefono solo falla la llamada al lector qr la primera vez después de ser instalado. Después de fallar esta primera vez, funciona correctamente, hasta que desintalo e intalo la aplicación. ¿alguien más tiene este problema y sabe solucionarlo?

    ResponderEliminar
    Respuestas
    1. Hola, estoy teniendo este mismo problema....Alguien mas lo ha detectado??? Sabéis a que se debe??? Muchísimas gracias!!!

      Eliminar
    2. PEP LLUIS SOLUCIONASTE EL PROBLEMA?? ME IRIA MUY BIEN LA RESPUESTA! GRACIAS!!

      Eliminar
  10. Hola PEPLLUIS,

    El problema que comentas la verdad que nunca me lo ha dado, y no sé porqué puede ser.

    Investiga en el LogCat en tu emulador de android, a ver si pone algún warning, la primera vez que se ejecuta el lector QR, (imagino que será cuando se lanza la actividad de scaneo del zXing desde tu aplicación).

    Échale un vistazo y me comentas a ver.

    Un saludo

    ResponderEliminar
  11. Saludos muy buen tutorial, me ha sido de mucha utilidad y los consejos también, tengo una duda el momento de presionar el botón que me lanza el intent me abre la cámara me escanea y me aparece una pantalla con la información y en la parte inferior tres botones (Búsqueda web, Compartir por Correo Electrónico, Compartir por SMS) pero lo que necesito es que me cargue el contents en un AutoCompleteTextView directamente le agregado este código al método pero no me ejecuta?

    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    if (requestCode == 0) {
    if (resultCode == RESULT_OK) {
    String contents = intent.getStringExtra("SCAN_RESULT");
    String format = intent.getStringExtra("SCAN_RESULT_FORMAT");
    Intent i = new Intent(this, Result.class);
    i.putExtra("lectura", contents);
    startActivity(i);
    // Handle successful scan
    } else if (resultCode == RESULT_CANCELED) {
    // Handle cancel
    }
    }

    Te agradecería mucho la ayuda

    ResponderEliminar
  12. Buenas Juccis,

    Lo primero, que supongo que habrá sido un fallo al copiar el código, le falta una llave de cierre al método.

    Luego, imagino que el problema es que no te lanza el Intent i, lo primero comprueba que lanzas el startActivityForResult con el código 0, para que cuando haga el if(requestCode==0) lo supere.

    También prueba al crear el intent hacerlo como sigue:

    Intent i = new Intent(claseActual.this,Result.class);

    Es decir, en vez de solo this, ponle el nombre de la clase desde donde estas lanzando el intent antes.

    Mira a ver si te funciona así y me cuentas.

    Un saludo.

    ResponderEliminar
  13. Muchas gracias por el post! Seguí el tutorial en inglés pero me daba fallos en el proyecto que no sabía solucionar, porque eclipse se quejaba de que no encontraba los recursos R.id.XXX en vez de decirte que ya no se pueden usar en un switch -_-

    En fin, que muchas gracias porque he encontrado exactamente los mismos errores que tú.

    ResponderEliminar
  14. Por cierto, para que salga el nombre de tu aplicación en vez de Barcode Scanner es mejor aún borrar todos los app_name de values-XX/strings.xml del proyecto, así su Manifest coge tu app_name

    ResponderEliminar
  15. Buenas,

    Anónimo1 - Pa servir!, pero sí, efectivamente, al pasar el proyecto a librería no pue usar los R.id.xx en los switchs porque no son constantes.

    Anónimo2 - Cierto, ese sistema también funciona, aunque requiere más paciencia para ir borrando la línea de cada .xml, he añadido en el tutorial algo más de explicación sobre esa parte incluyendo tu apunte.

    Un saludo y gracias!

    ResponderEliminar
  16. jstyl8 Realmente muchas gracias me has ayudado mucho con el programa que quiero hacer, me he quedado un poco ya que le he aumentado una opción como se muestra en esta imagen:
    http://www.imagengratis.org/?v=juccisprogram.jpg
    Como podría hacer para si es que elijo en el radio button códigos QR me seleccione directamente por un ejemplo la aplicación QR Droid y si por el contrario elijo Código de Barras me seleccione la aplicación Barcode Scanner directamente sin necesidad de estarla seleccionando la yo.
    En la parte superior explicas que seria cambiando esta linea com.google.zxing.cient.android.SCAN con la de tu proyecto me gustaría saber como hacer ya que ahora necesito dos aplicaciones externas a mi proyecto para que me lean los codigos (QR Droid, Barcode Scanner)Muchas Gracias!!

    ResponderEliminar
  17. Buenas Juccis,

    Por lo que he podido entenderte (supongo que no eres español xD), necesitas leer codigos QR y codigos de barras "clásicos".

    Para ello no necesitas usar 2 aplicaciones distintas como dices, la librería zXing permite leer códigos QR y de barras (aparte de otros), simplemente basta con lanzar el intent de la zXing como comento en la entrada, pero usando el método .putExtra de la siguiente manera:

    intent.putExtra("SCAN_MODE");

    (Quitándole el segundo parámetro). Con esto capturará todo los tipos de códigos que es capaz de leer (incluyendo QR y 1D Barcode).

    Supongo que eso resuelve tu problema, como digo, no es necesario usar 2 aplicaciones distintas, zXing puede con todo xD.

    Tienes mas info aquí:

    http://code.google.com/p/zxing/source/browse/trunk/android/src/com/google/zxing/client/android/Intents.java

    Un saludo!

    ResponderEliminar
  18. Buenas.

    Lo primero MUCHISIMAS GRACIAS por el articulo. Estoy con una aplicacion en la que queria incorporar codigos de barras y me ha venido al pelo!!!.

    Queria hacer una pregunta. Ya he incorporado la libreria a mi proyecto y realiza la llamada al lector de codigos, pero este sale como "descuadrado". Ya utilizaba Barcode Scaner antes y ahi aparecia correctamente la caja con la linea roja, pero al llamar al de la libreria, la caja con la linea roja aparecen movidas y la camara no enfoca bien los codigos. A ti supongo que te aparecera bien, te han comentado este problema???

    Estoy haciendo las pruebas con un Samsung Galaxy S.

    Muchisimas Gracias !!!

    ResponderEliminar
  19. Buenas Fernando,

    Gracias por las gracias! xD

    Mis móviles de pruebas fueron un HTC Desire y justamente un Samsung Galaxy S y no tuve los problemas que comentas.

    Se me ocurre que quizás se deba a la versión de la librería zXing que estas usando, prueba a bajarte la última revisión del repositorio o a una anterior si ya estas usando la última.

    Si te sigue dando problemas bajate la del enlace que puse, que es la que estoy usando yo y me va bien.

    http://www.megaupload.com/?d=3ZMZZ6EI

    Un saludo!

    ResponderEliminar
  20. Buenas de nuevo.

    Sigo atascado en el mismo punto grrrrrrrrrrrr. Adjunto pantallazo para aportar mas pistas XD al misterio: http://imageshack.us/photo/my-images/838/20111210171709.jpg/

    He probado con la version que esta en el trunk del proyecto y con la de la carpeta tags (1.5) y con las 2 me pasa lo mismo, es como si tuviera el zoom puesto. He probado en otro telefono y pasa igual.

    Estoy probando con tu proyecto, pero al añadirle mis core.jar (he probado con el de la rama principal y el del generado para la 1.5) se producen un monton de fallos en el codigo. Podrías subir tu core.jar ??? Es lo unico que me

    De nuevo muchisimas gracias, espero no tener que darte mas la brasaaaa!!!

    Saludosss

    ResponderEliminar
  21. Buenas Fernando,

    Pues sí que es raro, aunque el estilo de las letras del statusView a mi no me sale de esa manera xD, pero bueno, ahí te dejo el core.jar que estoy usando y me funciona, a ver si se te arregla.

    http://www.megaupload.com/?d=EJEF9WR8

    Un saludo

    ResponderEliminar
  22. Buenas!!!

    Se empieza a esclarecer el misterio o por lo menos saber el ¿por que???? No es por mi proyecto, ni por el core.jar con el tuyo me pasa lo mismo....La culpa es de ....Android y sus multiples versiones XD.

    En mi Samsung Galaxy S pasa eso porque tengo la version 2.3.3 instalada. He probado con el mismo apk en otro telefono con otra vesion y funciona a la perfeccion!!!!

    Ahora que la cosa esta mas acotada voy a ver si consigo solucionarlo y que funciona para esta version tambien.

    Muchisimas Gracias !!!

    ResponderEliminar
  23. Hola de nuevo,

    Las distintas versiones de android siempre dando por culo xD. En el que yo lo probé tenia la 2.1 creo recordar.

    Si encuentras alguna manera de que funcione en esa version comentamelo que la compatibilidad es importante xd

    Un saludo!

    ResponderEliminar
  24. hola que tal gracias por el tutorial, y pos bueno tengo algunos problemas al ejecutar el programa, no se si alguien me podría ayudar con el código de la aplicación funcionando con la librería incluida, disculpen si es mucho abuso, pero en verdad ya voy como mas de 5 veces intentando hacer la aplicación y siempre me da algún problema, mi correo: katanajmusik@hotmail.com, también quisiera saber si para ejecutar el lector de qr, tengo ke tener instalado algún programa en el emulador???

    de antemano gracias y perdón por el abuso y la dirección de correo.

    ResponderEliminar
  25. Buenas Paulo,

    Te recomiendo que antes de ponerte a trabajar con lo del zXing te veas algún tutorial de android y demás, como los de TheNewBoston que puedes encontrar en youtube, porque el tutorial esta relativamente claro y por mi parte no dispongo de tiempo ultimamente para consultas personales xDD

    Respecto a lo del lector QR, no termino de comprender la pregunta, que lector QR?¿, en el emulador se instala el .apk de tu proyecto que te genera eclipse, de hecho, lo hace el eclipse solo cuando le das a lanzarlo, así que no necesitas nada más que tu proyecto de eclipse instalado en el emulador.

    Un saludo

    ResponderEliminar
  26. Buenas....

    Hace tiempo escribi por aqui que tenia problemas con ciertas versiones de android, ya que al llamar al zXing salia el visor de escaner descuadrado...Pues bien parece que he solucionado el problema.

    He modificado mi AndroidManifest de mi programa principal y he añadido lo siguiente:



    Con esto se pinta correctamente!!!!

    Me ha costado Dios y ayuda encontrar la solución asique espero que esto ayude a más gente con este problema.

    Saludos.

    ResponderEliminar
  27. Uy que parece que no ha salido.
    Esto es lo que he añadido:


    uses-sdk android:minSdkVersion="3" android:targetSdkVersion="4"

    ResponderEliminar
  28. hola que tal de nuevo disculpas la molesta, porfin encontre el erro en mi aplicacion y por eso no me aparecia el escaner en el manifest en vez de DEFAULT le puse LAUNCHER y listo!!, bueno aki va la pregunta, en el manifest se accede en forma directa al com.google.zxing.client.CaptureActivity, pero yo kisiera saber si en vez de acceder directamente al CaptureActivity se puede acceder primero a la activity donde esta mi boton, luego al captureActivity para obtener la informacion del codigo y al final ir a otra activity con la informacion obtenida?? en cristiano seria: CaptureActivity se ejecute despues de otra activity y ke a su vez se dirija a otra activity ya ke en post del uso de zxing la aplicacion accede en forma directa al scanner y no a la opcion del boton.

    2. disculpando el abuso, como elimino los botones de (Búsqueda web, Compartir por Correo Electrónico, Compartir por SMS) cuando se ejecuta el scanner?

    ResponderEliminar
    Respuestas
    1. Hola, te tengo una pregunta el LAUNCHER lo cambias en el intent que tiene el SCAN o el MAIN? gracias

      Eliminar
  29. Fernando gracias por la info! Intentare eso en un problema que me estaba dando en móviles más nuevos, porque me esta puteando el zXing ahora xD

    Paulo, la gestion del CaptureActivity hasta donde yo se, tie k ser lanzandola con un startActivityforResult, es decir que tu llamas a Capture desde una actividad X y al volver del CaptureActivity el resultado se gestiona desde esa actividad X.

    En el post se accede al captureActivity cuando se pulsa el boton, el boton está para poder lanzar la actividad de captura.

    Respecto a lo segundo esta explicado en el post, justo es la primera "mejora" que comento que se puede hacer a la aplicación, cito:

    Para lo del menú, tan fácil como irnos al CaptureActivity.java del paquete com.google.zxing.cient.android y comentar 3 métodos, el onCreateOptionsMenu(Menu menu), el onPrepareOptionsMenu(Menu menu) y el onOptionsItemSelected(MenuItem item), con eso eliminaremos la función de menú.

    Un saludo!

    ResponderEliminar
    Respuestas
    1. Buenas.

      Espero que te haya servido, a mi me costo lo mio encontrar la solucion jeje.

      Bueno, si me lo permites queria hacer un poco de spam. Gracias a tu post he podido acabar la aplicacion que tenia entre manos y esta calentita calentita recien subida al market: https://market.android.com/details?id=com.once.escaner.tabWidgetOnce


      Saludos y muchas gracias por todo!!!

      Eliminar
  30. hola y gracias por responder, se supone que los codigos descritos anteriormente lo que hacen es pulsar el boton e ir a la clase CapturerActivity, pero en el MANIFEST del proyecto, esta una linea de codigo en la parte de que dice:
    android:name="com.google.zxing.client.android.CaptureActiviy", segun tutoriales que he visto al iniciar la aplicacion lo que hace es ke esta linea de codigo me indica ke esta clase es la principal (la primera ke ve el usuario) por ende no ingresa a la clase donde esta el boton, ahora si en vez de esa linea de codigo ponen: android:name=".MiClaseActivity" (el nombre de la clase del proyecto) ahi si, se dirige a la clase donde esta el boton, ahora el problema es como puedo ir a la clase CaptureActivity y obtener la informacion del SCAN desde otra clase ke no sea la principal ????

    ResponderEliminar
    Respuestas
    1. Hola Yo tengo una duda similar la verdad es que si pongo el android name como el de CaptureActivity no entrará a mi actividad donde tengo el botón y la acción de este. Si ya sabes como solucionarlo me podrías explicar? gracias

      Eliminar
  31. Hola, desde hace un tiempo atrás estoy trabajando en una aplicación en donde una de sus funcionalidades es leer códigos de barras, pero para implementar el ZXing en mi proyecto me llevo su tiempo ya que cuando arme el proyecto para usar la librería core.jar, el Eclipse no me generaba el archivo R.java automáticamente y en base a tu experiencia finalmente averigüé que ese problema se debía a que no estaba usando la versión correcta del SDK (usaba la versión 1.6, luego se me ocurrió bajarme la versión 2.2 del SDK que mencionaste) y después de hacer los ajustes necesarios en las propiedades del proyecto, pude arreglar eso.
    Por cierto, la parte en donde había que cambiar los switchs por ifs no lo pude hacer como decías, pero curiosamente si haciendo clic derecho sobre los switch y eligiendo la opción "Quick Fix".

    ResponderEliminar
  32. Buenas paulo

    No se porque pero cuando te conteste a tu ultimo mensaje no se guardo y ya se me olvido meterme por aqui.

    Para cambiar que clase se inicia al arrancar la aplicación puedes usar un Intent Filter dentro de las etiquetas de la actividad que quieras que se arranque al inicio, tal que asi:

    <intent-filter >
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>

    Para que funcione correctamente tienes que dejar la linea android:name tal como esta, eso solo especifica la "ruta" de la clase que representa la actividad, en este caso donde encontrar el captureActivity del zXing.

    Para recuperar la información se usa el método onActivityResult(), cogiendo del intent la información con el getStringExtra().

    Echale un vistazo a como vael startActivityForResult y el onActivityResult por esta pagina, a mi me vino bastante bien:

    http://developer.android.com/reference/android/app/Activity.html#StartingActivities

    Swicher, la opción de Control+1 es simplemente un atajo de teclado para lanzar el Quick Fix, pero como dices si no funciona el atajo, siempre se puede usar el boton derecho del raton y aparecera la opción en el desplegable.

    Gracias por el apunte de todos modos!

    Un saludo!!

    ResponderEliminar
  33. Hola,
    excelente tutorial. Lo he seguido al pie de la letra y me funciona todo perfecto siempre y cuando utilice el Barcode Scanner de google. Sin embargo, cuando quiero escanear con el Barcode Scanner de mi proyecto(hago lo que dices en las mejoras) al pulsar el boton no hace nada...
    Cuando estaba corrigiendo los errores, aparte de los switch y eso tuve que quitar varios @Overrides que me daban error, ¿tendrá eso algo que ver?¿Por qué puede ser?
    Muchas gracias por este gran trabajo ;-)

    ResponderEliminar
  34. Buenas,

    Primero gracias y segundo aclararte que el Barcode Scanner no es de google, es una aplicación del proyecto Zebra Crossing (zxing).

    La parte de las mejoras no es necesaria para que funcione, de ahí que sean mejoras, añadidos, sin hacer estas "mejoras" debería funcionarte de todos modos.

    Revisa el LogCat para saber porque pasa ese "no hace nada", normalmente revisarlo suele darte pistas sino la solución de porqué algo no funciona (sino sabes que es eso de LogCat, en unos días haré un tutorial explicando su uso, pero resumiendo es la "consola de Android" que te dice lo que estaba pasando en el dispositivo en cada momento, informandote tambien de los errores).

    Lo de los overrides no creo que sea, probablemente se deba a que al comentar los métodos del menu y demas no comentaste también esa etiqueta, y te da error porque no hay nada que "override".

    Revisa el logcat y me cuentas, o dame más información por que asi de primeras no se que puede ser.

    Un saludo!

    ResponderEliminar
  35. Hola,

    gracias por contestar tan rápido. Te explico lo de los @overrides que ayer conseguí resolverlo, por si quieres comentarlo en el artículo que a lo mejor no soy el único que se lo encuentra jaja.

    Cuando estamos eliminando los errores, tras pasar los switch a if-else a mí me seguía dando errores. Todos eran en los @overrides de algunos métodos de la librería que creamos y me decía que tenía que eliminarlos. Al parecer esto sucede cuando no estás trabajando con la versión 1.6 del jdk de java (yo trabajaba con 1.7)
    Ahora trabajo con el jdk 1.6 y ni rastro de estos errores.

    Respecto a lo de que "no hace nada" tienes razón, no me he pegado con el logcat aún así que como si no hubiese dicho nada jajaja. Si veo que no lo arreglo vuelvo por aquí :P

    Un saludo y muchas gracias por este magnífico artículo.

    ResponderEliminar
  36. Hola Gran Tutorial Jstyl_8,

    Tengo un problema y es que no me importa bien el /android del Zxing me sale el proyecto vacio, agradecería si puedas colgar el zip con el proyecto ya que he visto que lo pusiste pero estaba en megaupload xDD

    Un saludo

    ResponderEliminar
  37. Cierto R, maldito fbi, porque cojones tiene que borrar cosas que no son ilegales! Pero bueno, ahora lo he subido a un servidor propio, pa que no de más follones.

    La versión que he subido usa la revisión 2099 del repositorio de zXing, podeis bajarlo desde el siguiente link.

    http://www.hidelinks.com/?v2yjt0erng

    Cuando os pida pass poner 'zxing' sin las comillas.

    Un saludo!

    ResponderEliminar
    Respuestas
    1. Hola Jstyl_8

      He seguido todos los pasos de tu manual pero cuando voy a ejecutarlo en el emulador me sale este error.

      E/Database(418): sqlite3_open_v2("/data/data/net.desplazar/databases/barcode_scanner_history.db", &handle, 6, NULL) failed

      android.database.sqlite.SQLiteException: unable to open database file zXing en la clase CaptureActivity.java

      ¿Cuál puede ser el problema?

      Gracias

      Eliminar
    2. Pues ni idea porque puede darte ese error, normalmente te dice la ruta completa del fallo el LogCat, revisalo en la linea de código de tu proyecto a ver.

      A mi fallos con la base de datos esa nunca ma dao, asi que como no sea por algo de como lo usas no sé.

      Un saludo.

      Eliminar
  38. Por cierto se me olvido comentarte,

    La he probado en un teléfono y aparece la pantalla del escaneo la acerco a un código de barras suena como un click pero no hace nada.

    ¿Es normal?

    ¿Como puedo hacer para que vuelva a la aplicación original con el número de código de barras?

    ResponderEliminar
    Respuestas
    1. La vuelta a la aplicación tras escanear el código de barras es automática, de ahí lo de usar el startActivityForResult para lanzar el escaneo, y tratar el resultado en el onActivityResult() mediante el getStringExtra().

      El código que aparece permite solo escanear códigos QR, si quieres otro tipos de códigos tienes que cambiar el segundo string que le pasas al putExtra, (PRODUCT_MODE,ONE_D_MODE, etc) si quieres que escanee todo, no le pongas ningun putExtra.

      Tienes más info sobre eso en el Intents.java de la libreria.

      Revisa a ver si el código que escanees concuerde con el código que tienes "prefijado" en el código.

      Un saludo!

      Eliminar
    2. Gracias Jstyl_8,

      Ya conseguí que funcionará :)

      Eliminar
  39. Jstyl_8

    Una pregunta, ¿Existe la posibilidad de que no te pida instalar la aplicación barcode scanner cuando lo utilizas?

    ResponderEliminar
    Respuestas
    1. Justamente este sistema de integrar zXing consigue eso, no depender de la aplicación externa Barcode Scanner.

      Si te lo pide algo raro esta pasando xD, porque el sistema de usar zXing que te obliga a instalar la aplicación externa es este:
      http://jstyl8.blogspot.com/2012/01/zxing-integracion-en-tu-proyecto-usando.html

      Un saludo!

      Eliminar
  40. Hola Jstly_8

    Perdona se me olvido mencionarte que estoy utilizando las clases IntentResult e IntentIntegratos de la librería android-integrator.jar

    ¿Eso influye?

    ResponderEliminar
  41. Si no los utilizo me da el siguiente error por si te sirve de ayuda

    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{org.miproyecto/com.google.zxing.client.android.CaptureActivity}: java.lang.ClassNotFoundException: com.google.zxing.client.android.CaptureActivity in loader dalvik.system.PathClassLoader

    ResponderEliminar
    Respuestas
    1. Como te he comentado mas arriba, si haces uso de esas clases, no consigues integrar completamente zxing en tu aplicación.
      Ese sistema solo hace que tu aplicación llame a barcode scanner, una aplicacion externa, como digo, ese sistema esta explicado en el siguiente tutorial:

      http://jstyl8.blogspot.com/2012/01/zxing-integracion-en-tu-proyecto-usando.html

      El sistema que se explica en este tutorial si integra completamente zxing en tu aplicación, sin necesidad de usar la aplicación externa, sigue los pasos que se marcan y debería funcionar.

      Respecto al error que comentas:

      Esa excepcion generalmente se da cuando no tienes bien puesto el nombre de una actividad o el intentfilter que estas usando a la hora de lanzarla, en este caso el CaptureActivity, revisa como lanzas la actividad y posiblemente encontraras el error.

      Un saludo!

      Eliminar
  42. Lo primero gracias Jstyl_8 por tu tiempo y tus respuestas.

    Voy avanzando poco a poco xD

    Ya conseguí que funcionara sin instalar barcode scanner pero ahora escaneo y se me queda en la pantalla con la información y los tres botones abajo (Búsqueda de productos, búsqueda de web y google shopper) como le pasaba a Juccis. Si pudieras poner un ejemplo de como volver a la clase original y como jugar con ese "contents" para poder guardarlo en un textview, edittext etc... ya he utilizado el metodo que puso Juccis y la respuesta que le diste pero tampoco me ha funcionado

    ResponderEliminar
    Respuestas
    1. Entiendo que escanea el código pero no vuelve a la aplicación original tuya que lanza el scaneo, el problema es que la vuelta debería ser automática, en cuanto detecta el código que sea, vuelve a la aplicación.

      Si ese es el problema y ya has comprobado que el onActivityResult esta correcto, no se porque puede pasar, siento no poder ayudarte en esto xD

      Un saludo

      Eliminar
  43. Hola, yo tambien estoy teniendo ciertos problemas con la integración. Mi idea es que se abra el escaner desde un activity que no es la principal y al volver en el onActivityResult inicie otra.

    Si en el manifest de mi proyecto dejo que el Capture Activity sea action.Main, cuando se me abre el escaner se me queda la pantalla azul, con el rectangulo dentro pero no se ve la camara. En cambio, si en vez de lanzarlo desde mi activity pruebo a hacerlo desde la principal si que se abre bien.

    ¿Que parametros del intent filter habria que poner para poder lanzarlo desde mi activity? He probado a quitar el primero y dejar solo el de scan y me quedo igual, y si en el de scan pongo en vez de default launcher, me va bien pero me abre la app del barcode y eso no es lo que pretendo.

    ¿Alguna idea?

    Muchas gracias

    ResponderEliminar
    Respuestas
    1. En las pruebas que yo he hecho, al quitar el intent-filter con el action.MAIN del captureActivity en el manifest de mi proyecto directamente me petaba la aplicación al lanzar el scanner.

      Así que ese intent-filter tiene que estar, pero tienes que lanzar el captureactivity usando el segundo.

      Además que según yo tengo hecho no es necesario que la actividad que maneja el startActivityForResult() que lanza el intent del scanner tenga un intent-filter action.MAIN.

      En mi caso, mi actividad que lanza el scanner simplemente tiene el intent-filter compuesto por el action correspondiente y la category DEFAULT.

      Revisa a ver si tas usando los intent correctamente, porque parece que sea fallo de que tas usando para lanzar el scanner el primer intent-filter en lugar del segundo.

      Un saludo

      Eliminar
    2. Hola, gracias por tu respuesta. Creo que he descubierto porque me falla y no tiene nada que ver con el intent-filter. Por lo que he podido comprobar, mi activity coge sus datos de una base de datos interna de la app, si accedo a ésta para recuperar los datos y posteriormente inicio el escaner es cuando me sale la pantalla en gris/azul.

      He lo he probado sin coger los datos de la base de datos y si funciona.

      Ya se que esta pregunta no tiene nada que ver con el tema, pero se os ocurre por qué puede ser esto?

      Gracias de nuevo

      Eliminar
    3. Creo que no tiene nada que ver con la base de datos, ya que he metido unos datos aleatorios y sigue sin funcionar. Más bien parece tener que ver con que estoy haciendo la aplicación para tablets y estoy utilizando Fragments. Al cargar los datos en los fragments es cuando parece que falla...
      Voy a seguir investigando a ver si encuentro el problema.
      Gracias!!

      Eliminar
    4. Con BD a mi no me ha dao problemas la librería, aunque no se que compatibilidad tiene con tablets, lo que yo he probao a sido siempre en móvil, así que ni idea en ese punto xD, pero si consigues algo coméntalo!

      Un saludorr

      Eliminar
  44. Hola amigo, lo primero de todo gracais por tu ayuda, verás después de estar probando miles de cosas sigue sin funcionarme. Me he bajado tu proyecto y lo he importado siguiendo todos los pasos...

    Y me da este error:

    E/AndroidRuntime(3529): Caused by: java.lang.ClassNotFoundException: com.google.zxing.client.android.CaptureActivity in loader dalvik.system.PathClassLoader[/system/framework/com.google.android.maps.jar:/data/app/com.bervimo.]

    He hecho todo lo que he podido pero no he podido solucionarlo, he mirado el manifest, el build path pero todo esta bien.. Estoy algo desesperado, gracias de antemano, un saludo

    ResponderEliminar
    Respuestas
    1. He resubido el proyecto de mi libreria, podeis bajarlo desde aqui (password zxing)

      http://www.hidelinks.com/?ghvw4k7r2q

      Lo he resubido con el Intents por defecto, esto es, sin la mejora que elimina la pregunta de que aplicación quieres usar, asi el manifest y el intents estan por defecto, y es acorde a la explicación que hay en la entrada, El resto de mejoras si las tiene.

      Recordad importar el core.jar correcto tanto en tu proyecto de aplicación como en el que yo he subido (dicho core.jar esta en el raiz del proyecto que he subido), si coges otro, seguramente pete porque es otra version!

      Además esta configurado para coger la ruta hasta el core.jar de mi pc, que seguramente sea distintos a como tu lo tienes!

      Espero que te ayude,

      Un saludo!

      Eliminar
  45. Hola!

    He seguido los pasos fielmente. Con BarEncoder o con cualquier otro lector de QR me funciona perfecto. Si intento utilizar el "mi" lector el programa peta, me dice que se ha producido un error y que fuerce el cierre

    ResponderEliminar
    Respuestas
    1. Revisa la consola del LogCat y ponme aquí el error que te da para poder ayudarte, siendo tan general puede ser cualquier cosa!

      Eliminar
    2. te pongo el link a una captura de pantalla ok? gracias por responder :P

      http://img846.imageshack.us/img846/8978/errordg.png

      Eliminar
    3. añado de antemano para acelerar esto:

      En las propiedades del proyecto ZxingLib, está añadido como JAR externo el core.jar al igual que en mi proyecto. También está marcado como librería el ZxingLib. En las propiedades de mi app está añadida la libreria ZxingLib

      Eliminar
    4. He actualizado la entrada con errores comunes, creo que el tuyo es que has cambiado la línea android:name del manifest de tu proyecto en lugar del intent-filter.

      Para lo de que no pida que aplicación usar para el scanner, hay que modificar el intent-filter ACTION no esa línea de android:name.

      Creo que eso resolverá el problema.

      Un saludo!

      Eliminar
  46. como puedo bajar tu proyecto si me pide contraseña?????????????????

    ResponderEliminar
  47. disculpa una pregunta ya me corre la libreria y el programa pero a la hora de capturar la lectura del codigo qr no me manda el contenido del qr no sabes por k ????

    ResponderEliminar
  48. cuando se importa la libreria al IDE y cuando la libreria es importada a un proyecto nuevo, es normal que aparesca un signo de admiracion color junto al icono de la carpeta que esta en el explorador de paquetes, o es algun tipo de error?

    ResponderEliminar
    Respuestas
    1. resuleto era el core que no lo habia agregado, pero ahora me salio otro problema.
      despues que la aplicacion entra al scaner y lee el codigo QR este no muestra la informacion contenida en el qr D:
      gracias

      Eliminar
    2. Como la estas intentando mostrar?
      El contenido es un String (que se consigue con el getStringExtra() ), asi que si no muestras ese string directamente no va a hacer nada, porque el codigo del onActivityResult() que hay en la entrada solo obtiene el raw del QR leido pero no hace nada con el..

      Completa el onActivityResult() mostrandolo en un textview o algo y me comentas

      Eliminar
  49. Hola amigazo excelente post muchas gracias me a servido de mucho una pregunta asi como tienes este codigo de lector de qr no te has puesto a hacer un generador de codigos qr y si es asi xfa subele si muchas gracias y excelente trabajo te felicito

    ResponderEliminar
  50. Gracias, justo lo que pides lo tienes en el siguiente enlace:

    http://jstyl8.blogspot.com.es/2012/05/zxing-creacion-de-codigos-qr.html

    Un saludo.

    ResponderEliminar
  51. W/dalvikvm(1672): VFY:unable to resolve static field 51 (ISSUE_NUMBER) in Lcom/google/zxing/ResultMetadataType;
    I/dalvikvm(1672): Could not find method com.google.zxing.ResultPoint.getX, referenced from method com.google.zxing.client.android.CaptureActivity.drawLine
    Tengo puesto en referenced libraries en los dos proyectos el core.jar
    Alguna idea?

    ResponderEliminar
    Respuestas
    1. Perdona por ser tan descortés. Gracias por tu post y saludos desde Tenerife.

      Eliminar
    2. Tiene toda la pinta que estes usando un core.jar distinto de la versión del proyecto zXing importado, por eso te dice que no encuentra un metodo que se referencia desde el CaptureActivity, tienen que ser ambos de la misma versión.

      Eliminar
    3. Me baje la versión que pusiste disponible para descarga y el jar que utilizo es el que está en el raíz del comprimido. Cuando cargo el proyecto en el Eclipse sólo me da warning de tipo "deprecated" por ejemplo con el tipo clipboardManager. Es verdad que lo estoy lanzando con el emulador no sobre un teléfono pero por los errores yo también entiendo como que no coje el core. algo me falla y no sé que es. De nuevo muchas gracias por tu generosidad en la expansión del conocimiento.

      Eliminar
    4. He vuelto a bajarme el proyecto y lo he probado otra vez y me funciona, enlazando el core.jar que viene en la raíz.
      No me dice nada de warnings, prueba a cambiar el jdk al 1.6, creo que a alguno le ha funcionado y a poner la libreria con android 4.0 si no esta ya puesta.

      Si no te va, a saber, versiones de android de java manifest, puedes probar a usar una nueva revisión de la librería zxing que quizás corrija más bugs...

      un saludo.

      Eliminar
  52. Hola, Gracias por el y los post anteriores.
    He llegado a realizar todos los pasos pero al momento de probar en mi cel q es el Galaxy Nexus, me salen errores, el primero de ellos es ;
    06-20 16:18:46.644: E/AndroidRuntime(6515): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.xxxx.qr/com.xxxx.qr.ZXingDemoActivity}: java.lang.NullPointerException
    06-20 16:19:36.909: E/AndroidRuntime(6586): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)

    Probe con el jdk 1.7 y me descargue el 1.6. Tb uso el android v14, y lo demás parecer igual.

    Tb ahora ya no se puede descargar del megaupload, que es donde tenias tu proyecto, podrás subirlo a otro link.

    Gracias y felicitaciones

    ResponderEliminar
  53. Si has revisado la entrada, tras el cierre de Megaupload, el proyecto lo subí a otro host.

    Respecto a ese fallo, ni idea, pero lo de demoActivity me suena raro, como si estuvieras ejecutando otra cosa...

    Un saludo.

    ResponderEliminar
  54. me sale un error en

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"

    ResponderEliminar
    Respuestas
    1. Es un fallo del xml, y el propio xml te suele decir que es lo que falla, revisa la línea del error.

      Eliminar
  55. Hola, me gustaria saber a ver si podriais ayudarme. Veras me gustaria cortejar el rawResult con una base de datos (en mi caso tiene que ser la de la propia libreria ya al llamar a la libreria si creo una en mi aplicacion no se genera y no se porque pero bueno caso a aparte) y que esta de devuelva un resultado (ya sea en el propio raw o lo que sea) pero esta tonteria no consigo que me funcione alguna idea?? Por favor es urgente si me contestasen se lo agradeceria

    ResponderEliminar
  56. genio! veo q tenes la panacea del zxing, te pego mi logcat y me ayudas? mi aplicacion ejecuta en mi celu, pero cuando apreto el boton scan salta la interrupcion del proceso...

    09-05 12:18:12.230: E/AndroidRuntime(32737): FATAL EXCEPTION: main
    09-05 12:18:12.230: E/AndroidRuntime(32737): java.lang.ExceptionInInitializerError
    09-05 12:18:12.230: E/AndroidRuntime(32737): at java.lang.Class.newInstanceImpl(Native Method)
    09-05 12:18:12.230: E/AndroidRuntime(32737): at java.lang.Class.newInstance(Class.java:1409)
    09-05 12:18:12.230: E/AndroidRuntime(32737): at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
    09-05 12:18:12.230: E/AndroidRuntime(32737): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1573)
    09-05 12:18:12.230: E/AndroidRuntime(32737): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1675)
    09-05 12:18:12.230: E/AndroidRuntime(32737): at android.app.ActivityThread.access$1500(ActivityThread.java:121)
    09-05 12:18:12.230: E/AndroidRuntime(32737): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:943)
    09-05 12:18:12.230: E/AndroidRuntime(32737): at android.os.Handler.dispatchMessage(Handler.java:99)
    09-05 12:18:12.230: E/AndroidRuntime(32737): at android.os.Looper.loop(Looper.java:123)
    09-05 12:18:12.230: E/AndroidRuntime(32737): at android.app.ActivityThread.main(ActivityThread.java:3701)
    09-05 12:18:12.230: E/AndroidRuntime(32737): at java.lang.reflect.Method.invokeNative(Native Method)
    09-05 12:18:12.230: E/AndroidRuntime(32737): at java.lang.reflect.Method.invoke(Method.java:507)
    09-05 12:18:12.230: E/AndroidRuntime(32737): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
    09-05 12:18:12.230: E/AndroidRuntime(32737): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624)
    09-05 12:18:12.230: E/AndroidRuntime(32737): at dalvik.system.NativeStart.main(Native Method)
    09-05 12:18:12.230: E/AndroidRuntime(32737): Caused by: java.lang.NoClassDefFoundError: com.google.zxing.ResultMetadataType
    09-05 12:18:12.230: E/AndroidRuntime(32737): at com.google.zxing.client.android.CaptureActivity.(CaptureActivity.java:102)
    09-05 12:18:12.230: E/AndroidRuntime(32737): ... 15 more

    ResponderEliminar
    Respuestas
    1. Pues... ni idea, pero estará aquí:

      Caused by: java.lang.NoClassDefFoundError: com.google.zxing.ResultMetadataType

      Eliminar
  57. Hola Jstyl de antemano te agradezco, Muy buen tutorial.
    Necesito hacerte una pregunta

    Al momento de compilar Me salen 2 tipos de error Tu sabes que puede ser?
    Al momento de Correrlos

    could not get wglGetExtensionsStringARB
    y
    com.google.zxing.client.android.CaptureActivity] Could not find com.google.zxing.client.android.CaptureActivity.apk!

    Te envió una imagen
    http://i45.tinypic.com/2i7agd5.png
    De ante mano gracias nuevamente!

    ResponderEliminar
    Respuestas
    1. Lo primero es del emulador, no creo que tenga nada que ver con el zxing, prueba a ejecutar otra aplicación a ver si te sigue saliendo, de todos modos, prueba esto:

      http://stackoverflow.com/questions/11407501/android-emulator-could-not-get-wglgetextensionsstringarb-error

      El segundo puede ser que el proyecto de librería zxing no se haya compilado bien, y el apk no se haya generado, revisalo.

      un saludo

      Eliminar
  58. Sabes si funciona con la librerias del ZXING de la versión 2.0? Gracias porque no me correo ni a patadas...

    ResponderEliminar
    Respuestas
    1. No tengo ni idea, yo me bajaba directamente las revisiones del repositorio, así que no sé a que revisión corresponderá esa v2.0 que se puede descargar directamente desde el proyecto.

      Eliminar
  59. Hola!!
    Primero que todo queria felicitarte por el tutorial esta excelente!! sin embargo he tenido algunos problemas , al tratar de ejecutar "mi lector" se cae si uso los instalados funciona perfecto.

    aca el link del error: http://imageshack.us/photo/my-images/404/erroreso.png/

    ResponderEliminar
    Respuestas
    1. Debe ser alguna incompatibilidad entre el core.jar y el proyecto de la librería en si, no puedo decirte más.

      Eliminar
  60. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  61. Buenas Jstyl_8. Primero que nada mil gracias por tomarte el tiempo de preparar esta guia y mas aun por la paciencia que implica el responder a las inquietudes y problemas de los mas neofitos como nosotros. Ya entrados en el tema quisiera saber si puedes echarme la mano pues no he podido manejar los resultados del escaneo ya que solo he podido imprimir cuando se "cancela" el escaneo. Anexo la "miserable" manera en que estoy manejando los datos y pues agradezco tu ayuda o la de cualquier buen samaritano que lea esto y disponga de unos minutos.

    ResponderEliminar
    Respuestas
    1. 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.
      textViewPrincipal.append("Resultado del escaneo: "+contenido);
      } else if (resultCode == RESULT_CANCELED) {
      // Si se cancelo la captura.
      textViewPrincipal.append(" Escaneo cancelado! ");
      }
      }
      }

      Eliminar
    2. Si no se esta escaneando ningún código nunca entrará con el resultCode OK, así que asegúrate que escaneas un código.
      Otras cosas que puedes probar es que haces el startactivityforresult con el requestcode 0, o prueba el método setText() en lugar del append().

      Eliminar
  62. Hola, hice todo el tutorial y tengo una duda cuándo lo pongo a correr el me muestra:
    [2012-09-29 22:10:04 - android_register] Performing sync
    [2012-09-29 22:10:04 - android_register] Automatic Target Mode: Preferred AVD 'Celulito' is available on emulator 'emulator-5554'
    [2012-09-29 22:10:05 - android_register] Application already deployed. No need to reinstall
    [2012-09-29 22:10:05 - android_register] \android_register\bin\android_register.apk installed on device
    [2012-09-29 22:10:05 - android_register] Done!
    y no hace ninguna acción. Mi proyecto se llamam android_register y mi activity is la main_Activity no se que puede estar pasando

    ResponderEliminar
    Respuestas
    1. Pues que la aplicación ya esta instalada en el emulador, y por alguna razón no se ejecuta automáticamente, simplemente usa el emulador para lanzar la aplicación, seleccionándola.

      Eliminar
    2. Primero gracias por responder. sobre mi duda; eso hago, pero no me aparece en la lista de aplicaciones como para ejecutarla, lo mismo pasa cuando se instala en un celular no hace nada.Intenté lo de cambiar el DEFAULT por LAUNCHER sin embargo no funciona aun.

      Eliminar
    3. Te pasa solo con esta aplicación? O con otras? Si es con otras será problema del emulador y demás, sino coge el manifest de una que funcione y copia todo lo que puedas en la que te da problemas, algunas veces me ha pasado y así se me arregló.

      Eliminar
    4. Hola, solo me pasa con ésta. Haré lo que me dices a ver que pasa. Tengo un pregunta sobre el DEFAULT y LAUNCHER. Cuándo se usa cada uno, es que al cambiar éstas observo cambios en mi aplicación.
      Gracias por adelantado

      Eliminar
    5. En esta web puedes encontrar explicaciones sobre los distintos intent-filter:

      http://developer.android.com/reference/android/content/Intent.html

      Con LAUNCHER indicas que esa actividad se debe ejecutar al arrancarse la aplicación.

      El DEFAULT es que se ejecute cuando se pulse el botón de home típico, normalmente yo se lo ponía a todas, supongo que habrá algo más por ahí, pero lo desconozco.

      Eliminar
    6. muchas gracias, leeré e intentaré organizar todo a ver si funciona

      Eliminar
  63. Hola, interesante artículo, yo tengo un problemilla al realizar una aplicación de ejemplo: adjunto log del logcat

    10-04 13:40:47.092: E/GetJar SDK(32397): PackageMonitor: doOnReceive(): failed
    10-04 13:40:47.092: E/GetJar SDK(32397): java.lang.IllegalStateException: Unable to access the application key
    10-04 13:40:47.092: E/GetJar SDK(32397): at com.getjar.sdk.data.metadata.PackageMonitor.doOnReceive(PackageMonitor.java:113)
    10-04 13:40:47.092: E/GetJar SDK(32397): at com.getjar.sdk.data.metadata.PackageMonitor.access$000(PackageMonitor.java:62)
    10-04 13:40:47.092: E/GetJar SDK(32397): at com.getjar.sdk.data.metadata.PackageMonitor$1.run(PackageMonitor.java:87)
    10-04 13:40:47.092: E/GetJar SDK(32397): at java.lang.Thread.run(Thread.java:856)


    Ojalá me pudieras echar una mano, a que se puede referir? no
    encuentra el .jar?

    Gracias por adelantado.

    ResponderEliminar
    Respuestas
    1. Ese error no creo que tenga que ver con zxing, más bien parece del GetJar, como indica el propio logcat, y ese SDK no lo tocao nunca, así que ni idea.

      Eliminar
  64. Hola, gracias por su respuesta, la verdad es que no había error ahí. Ahora me salió otro error, el mismo que le salió al compañero lezalel:

    10-05 11:19:34.479: E/AndroidRuntime(9695): FATAL EXCEPTION: main
    10-05 11:19:34.479: E/AndroidRuntime(9695): java.lang.ExceptionInInitializerError
    10-05 11:19:34.479: E/AndroidRuntime(9695): at java.lang.Class.newInstanceImpl(Native Method)
    10-05 11:19:34.479: E/AndroidRuntime(9695): at java.lang.Class.newInstance(Class.java:1319)
    10-05 11:19:34.479: E/AndroidRuntime(9695): at android.app.Instrumentation.newActivity(Instrumentation.java:1053)
    10-05 11:19:34.479: E/AndroidRuntime(9695): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1974)
    10-05 11:19:34.479: E/AndroidRuntime(9695): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
    10-05 11:19:34.479: E/AndroidRuntime(9695): at android.app.ActivityThread.access$600(ActivityThread.java:130)
    10-05 11:19:34.479: E/AndroidRuntime(9695): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
    10-05 11:19:34.479: E/AndroidRuntime(9695): at android.os.Handler.dispatchMessage(Handler.java:99)
    10-05 11:19:34.479: E/AndroidRuntime(9695): at android.os.Looper.loop(Looper.java:137)
    10-05 11:19:34.479: E/AndroidRuntime(9695): at android.app.ActivityThread.main(ActivityThread.java:4745)
    10-05 11:19:34.479: E/AndroidRuntime(9695): at java.lang.reflect.Method.invokeNative(Native Method)
    10-05 11:19:34.479: E/AndroidRuntime(9695): at java.lang.reflect.Method.invoke(Method.java:511)
    10-05 11:19:34.479: E/AndroidRuntime(9695): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
    10-05 11:19:34.479: E/AndroidRuntime(9695): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    10-05 11:19:34.479: E/AndroidRuntime(9695): at dalvik.system.NativeStart.main(Native Method)
    10-05 11:19:34.479: E/AndroidRuntime(9695): Caused by: java.lang.NoClassDefFoundError: com.google.zxing.ResultMetadataType
    10-05 11:19:34.479: E/AndroidRuntime(9695): at com.google.zxing.client.android.CaptureActivity.(CaptureActivity.java:107)
    10-05 11:19:34.479: E/AndroidRuntime(9695): ... 15 more


    Según eso el error está en la línea marcada con * pero no sé como solucionarlo, ¿tienes alguna idea?

    private static final Set DISPLAYABLE_METADATA_TYPES =
    *EnumSet.of(ResultMetadataType.ISSUE_NUMBER*,
    ResultMetadataType.SUGGESTED_PRICE,
    ResultMetadataType.ERROR_CORRECTION_LEVEL,
    ResultMetadataType.POSSIBLE_COUNTRY);

    Mil gracias de verdad :)

    ResponderEliminar
  65. Ya lo he solucionado, he utilizado la solución 3 de aquí:

    http://stackoverflow.com/questions/11959091/class-not-found-when-using-zxing

    Your jar is not in the /libs folder. This happens when you have added the jar to the build path, but newer versions of ADT need it to be in /libs. Put it there and re-add it to the build path.

    ResponderEliminar
    Respuestas
    1. Ok, gracias por el link, lo añado a la entrada principal por si a alguien más le pasa.

      Eliminar
  66. Saludos, escribo para agradecer la moslestia de subir este tutorial, pero tengo que comentarte una duda. Cuando importo tu proyeto me aparece en su carpeta del arbol de proyectos una exclamacion el roja, y al incluir esta libreria en mi proyecto, tamben me aparece ese icono en mi proyecto. Necesito con urgencia solucionar este problema. Muchas gracias

    ResponderEliminar
    Respuestas
    1. En el tutorial esta explicado, tienes que corregir el build-path, eligiendo el core.jar correcto que esta en la raíz del proyecto.

      Eliminar
  67. Hola Jstryl_8, lo primero enhorabuena por tu tutorial, le he seguido paso a paso unas cuantas veces y no hay manera de q funcione. Uso zxing-2.0 y espero q este no sea el problema. No entiendo el uso del repositorio 2099 en vez de utilizar directamente la libreria de ZXing. Por supuesto soy nuevo en Android y mucho mas en el uso de la libreria ZXing.
    Muchas gracias y espero tu respuesta

    ResponderEliminar
    Respuestas
    1. Usé el repositorio en su día (hace un año) porque no existía esa distribución de zXing en un .zip directamente, de todos modos usar el repositorio es prácticamente lo mismo, porque tienes el mismo código, pero obtenido de otra manera.

      Como ya he comentado por arriba ahora no estoy con zXing, y desconozco si este tutorial funciona para las distribucion 2.0, 2.1 etc, porque como es normal van añadiendo cambios en el código que puede que hagan que se deba usar de forma distinta.

      En un plazo corto-medio no tengo pensado ponerme otra vez con ello porque no dispongo de tiempo, así que no podré ayudarte, intenta usar las versión que menciono o a ver si alguien encuentra una manera de que la nueva funcione.

      Eliminar
  68. Muchas gracias Jstyl_8 por la rapida respuesta y explicaciones.
    Un saludo

    ResponderEliminar
  69. Hola buenos días, antes de nada excelente tutorial.
    Estoy empezando con esto y aún tengo fallos estúpidos...
    Mi problema es que al pulsar el botón me fuerza el cierre de la aplcación. En el código del botón sólo tengo esto:

    Button b1 = (Button)findViewById(R.id.button1);
    b1.setOnClickListener(new OnClickListener()
    {
    public void onClick(View v)
    {
    //TextView tv = (TextView)findViewById(R.id.textView1);
    //tv.setText("Pulso botón 1 alineación vertical");
    Intent intent = new Intent("com.google.zxing.client.android.SCAN");
    intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
    startActivityForResult(intent, 0);
    }
    });

    Cual puede ser el problema??
    Gracias

    ResponderEliminar
  70. Buenas otra vez, creo que se cual puede ser el error. No había agregado el core.jar como libreria externa en mi proyecto. El problema que al hacerlo me dice esto:

    Could not write file: C:\Users\Diego\Desktop\eclipse\workspace\NavegadorWeb\.classpath.
    C:\Users\Diego\Desktop\eclipse\workspace\NavegadorWeb\.classpath (Acceso denegado)

    ¿qué puede ser?
    Gracias

    ResponderEliminar
  71. Vale...yo me lo guiso yo me lo como...
    Borra si quieres mis dos anteriores post.
    He rehecho todo y he conseguido que me saque un menu para elegir cual es el lector qr que quiero usar. Me sale el mio con dos nombres diferentes y no saca el que tengo instalado.
    El problema que al darle a cualquiera de los dos la aplicación fuerza el cierre y no consigo ver por que. Te pego el log que genera:

    11-19 17:00:57.687: E/AndroidRuntime(641): FATAL EXCEPTION: main
    11-19 17:00:57.687: E/AndroidRuntime(641): java.lang.ExceptionInInitializerError
    11-19 17:00:57.687: E/AndroidRuntime(641): at java.lang.Class.newInstanceImpl(Native Method)
    11-19 17:00:57.687: E/AndroidRuntime(641): at java.lang.Class.newInstance(Class.java:1409)
    11-19 17:00:57.687: E/AndroidRuntime(641): at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
    11-19 17:00:57.687: E/AndroidRuntime(641): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1561)
    11-19 17:00:57.687: E/AndroidRuntime(641): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
    11-19 17:00:57.687: E/AndroidRuntime(641): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
    11-19 17:00:57.687: E/AndroidRuntime(641): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
    11-19 17:00:57.687: E/AndroidRuntime(641): at android.os.Handler.dispatchMessage(Handler.java:99)
    11-19 17:00:57.687: E/AndroidRuntime(641): at android.os.Looper.loop(Looper.java:123)
    11-19 17:00:57.687: E/AndroidRuntime(641): at android.app.ActivityThread.main(ActivityThread.java:3683)
    11-19 17:00:57.687: E/AndroidRuntime(641): at java.lang.reflect.Method.invokeNative(Native Method)
    11-19 17:00:57.687: E/AndroidRuntime(641): at java.lang.reflect.Method.invoke(Method.java:507)
    11-19 17:00:57.687: E/AndroidRuntime(641): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
    11-19 17:00:57.687: E/AndroidRuntime(641): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
    11-19 17:00:57.687: E/AndroidRuntime(641): at dalvik.system.NativeStart.main(Native Method)
    11-19 17:00:57.687: E/AndroidRuntime(641): Caused by: java.lang.NoClassDefFoundError: com.google.zxing.ResultMetadataType
    11-19 17:00:57.687: E/AndroidRuntime(641): at com.google.zxing.client.android.CaptureActivity.(CaptureActivity.java:104)
    11-19 17:00:57.687: E/AndroidRuntime(641): ... 15 more
    Muchas gracias y mil disculpas por ser tan pesado :S

    ResponderEliminar
    Respuestas
    1. También me da estos warning que supongo que necesitaras saberlo:

      11-19 17:00:57.407: W/dalvikvm(641): VFY: unable to resolve static field 969 (ISSUE_NUMBER) in Lcom/google/zxing/ResultMetadataType;
      11-19 17:00:57.417: W/dalvikvm(641): VFY: unable to find class referenced in signature (Lcom/google/zxing/ResultPoint;)
      11-19 17:00:57.417: W/dalvikvm(641): VFY: unable to find class referenced in signature (Lcom/google/zxing/ResultPoint;)
      11-19 17:00:57.417: W/dalvikvm(641): VFY: unable to resolve virtual method 3221: Lcom/google/zxing/ResultPoint;.getX ()F
      11-19 17:00:57.447: W/dalvikvm(641): VFY: unable to find class referenced in signature (Lcom/google/zxing/Result;)
      11-19 17:00:57.447: W/dalvikvm(641): VFY: unable to resolve virtual method 3217: Lcom/google/zxing/Result;.getResultPoints ()[Lcom/google/zxing/ResultPoint;
      11-19 17:00:57.458: W/dalvikvm(641): VFY: unable to find class referenced in signature (Lcom/google/zxing/Result;)
      11-19 17:00:57.477: W/dalvikvm(641): VFY: unable to resolve virtual method 3220: Lcom/google/zxing/Result;.toString ()Ljava/lang/String;
      11-19 17:00:57.497: W/dalvikvm(641): VFY: unable to find class referenced in signature (Lcom/google/zxing/Result;)
      11-19 17:00:57.517: W/dalvikvm(641): VFY: unable to resolve virtual method 3214: Lcom/google/zxing/Result;.getBarcodeFormat ()Lcom/google/zxing/BarcodeFormat;
      11-19 17:00:57.547: W/dalvikvm(641): VFY: unable to find class referenced in signature (Lcom/google/zxing/Result;)
      11-19 17:00:57.567: W/dalvikvm(641): VFY: unable to find class referenced in signature (Lcom/google/zxing/Result;)
      11-19 17:00:57.567: W/dalvikvm(641): VFY: unable to find class referenced in signature (Lcom/google/zxing/Result;)
      11-19 17:00:57.577: W/dalvikvm(641): VFY: unable to find class referenced in signature (Lcom/google/zxing/Result;)
      11-19 17:00:57.577: W/dalvikvm(641): VFY: unable to find class referenced in signature (Lcom/google/zxing/Result;)
      11-19 17:00:57.587: W/dalvikvm(641): VFY: unable to find class referenced in signature (Lcom/google/zxing/Result;)
      11-19 17:00:57.607: W/dalvikvm(641): VFY: unable to find class referenced in signature (Lcom/google/zxing/Result;)
      11-19 17:00:57.607: W/dalvikvm(641): VFY: unable to find class referenced in signature (Lcom/google/zxing/Result;)
      11-19 17:00:57.617: W/dalvikvm(641): VFY: unable to find class referenced in signature (Lcom/google/zxing/Result;)
      11-19 17:00:57.647: W/dalvikvm(641): Exception Ljava/lang/NoClassDefFoundError; thrown while initializing Lcom/google/zxing/client/android/CaptureActivity;
      11-19 17:00:57.647: W/dalvikvm(641): Class init failed in newInstance call (Lcom/google/zxing/client/android/CaptureActivity;)
      11-19 17:00:57.657: W/dalvikvm(641): threadid=1: thread exiting with uncaught exception (group=0x40015560)

      Eliminar
    2. Creo que el problema sigue siendo algo del core.jar con respecto a la libreria de zXing por esto:

      11-19 17:00:57.687: E/AndroidRuntime(641): Caused by: java.lang.NoClassDefFoundError: com.google.zxing.ResultMetadataType

      Algún tipo de incompatibilidad entre ellos pienso que puede ser.

      Aparte no entiendo lo del menú con los dos tipos de lectores?¿ Que quieres decir con eso? Que has hecho una aplicación que lanza otras 2?

      No sé, te aconsejaría que probaras que funcionara una simple, y luego ir añadiéndole más funcionalidades sobre una base que ya tengas.

      Eliminar
    3. Perdon por tardar tanto pero he estado de viaje jeje. El menu me sale solo siguiendo los pasos de tu explicacion. Y en cuanto al error del core...estoy utilizando el tuyo asi que no se porque puede ser si el tuyo no tenia ningun erros :S

      Eliminar
  72. Hola, queria pedirte un favor.

    como puedo hacer que se encienda el led de la camara cuando lanzo el intent de zxing para leer codigos de barras. gracias

    ResponderEliminar
    Respuestas
    1. Ni idea, supongo que existe una parte de la API para controlar el flash y demás, revísala y lo mismo encuentras algo que puedas usar.

      Eliminar
  73. Hola jstyl8.

    Primero darte las más sinceras gracias por este tutorial que me ha venido genial para el proyecto que estoy realizando.

    Pero por más que pruebo no consigo hacerlo funcionar. Ni con tu proyecto ni haciendolo todo desde 0.

    Me va perfecto hasta que pulso el boton, salen las opciones de escaneado y al pulsar se peta. Al realizar las mejoras igual, peta siempre.

    Me da siempre el mismo error: FATAL EXCEPTION : main
    java.lang.exceptionInInitializeError.

    Por favor si eres tan amable de ayudarme te lo agradecería.

    Gracias.

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

    ResponderEliminar
  75. Acabo de leer 3 post mas arriba que Diego tiene exactamente el mismo error que yo.

    El core.jar lo he agregado externamente de tu proyecto, tanto en la aplicación como en la libreria de Zxing.

    Puede ser que no funcione con la libreria 2.1 de Zxing? Podrías hacer el favor de problarlo. No soy nuevo en Android y la verdad que me estoy volviendo loco con esto.


    Mil gracias.

    ResponderEliminar
    Respuestas
    1. He probado de nuevo (solo en emulador porque no tengo teléfono Android ahora disponible) pero usando el proyecto que pongo y los pasos de poner core, manifest, etc, me funciona, se abre la cámara sin errores, aunque no puedo asegurar que capturando funcione pero casi seguro.

      Como digo por arriba desconozco si funciona para versiones posteriores a la revisión 2099 del proyecto de zxing, van ya por la 2560 así que imagina xD, ahora mismo no dispongo de tiempo para empezar a probarlo con las nuevas versiones, cuando lo tenga lo miraré a ver si este sistema ya no va y hay que buscar otra forma.

      De todos modos si estas mezclando archivos de lo mio con versiones actuales seguramente pete por incompatibilidad.

      Un saludo

      Eliminar
  76. Muchas gracias por la respuesta Jstyl seguiré intentandolo.

    Se agradece profundamente que gente como tu ayude así a los demás.

    Saludos.

    ResponderEliminar
    Respuestas
    1. Buenos días, he visto que tienes el mismo problema que yo. Si consiguieras solucionarlo me sería de gran ayuda que me dijeras como lo has hecho. Te dejo mi correo (raistlin818@hotmail.com)
      Gracias y suerte.

      Eliminar
  77. Eres grande! Me sirvió y mucho tu tutorial, en el simulador ya me funciona ahora solo me queda meterlo al móvil y probar.

    Muchísimas gracias por tu solidaridad!

    ResponderEliminar
    Respuestas
    1. Gracias a ti, siempre he creído que se aprende más compartiendo lo que se sabe :D

      Eliminar
  78. Hola Jstyl.

    Ya conseguí hacerlo funcionar!! Gracias por todo!

    No se si sabrás o alguna página que lo tenga como incrustar en la misma activiy el botón que lanza el intent y un cuadro para que se vea el scanner, es decir que no te habra una nueva activity para leer el código, si no que utlilize un fragmento de la activity inicial para escanearlo.

    Muchisimas gracias

    ResponderEliminar
    Respuestas
    1. Ni idea, para eso habría que meterse supongo en el layout de la cámara de zXing y sería más complicado.

      Quizás modificando el menú emergente ( el que en este tutorial se explica como esconder) se podría hacer algo por ahí.

      un saludo

      Eliminar
  79. Amigo,,,, Comienzo con tu tutorial finalizando comenzando el 2013 !!

    Te estaré contando como me va. Necesito que mi app escanee QR sin depender de otras apps.

    Gracias por tu ayuda.

    Slds,

    ResponderEliminar
  80. Podrias subir el archivo otra vez por favor? En esta pagina ya no esta disponible: http://www.hidelinks.com/?ghvw4k7r2q
    Muchas gracias

    ResponderEliminar
    Respuestas
    1. He añadido a la entrada otro link que sí funciona.

      Un saludo.

      Eliminar
  81. Increible. Gracias por el tuto. Curraísimo!!
    Un saludo.

    ResponderEliminar
  82. No se que puede ser pero me falla la aplicacion cuando la abro la primera vez con un intent desde otra app.. Solo falla la primera vez despues de instalacion! pero el mobil peta.. Solo es la primera vez, luego funciona de maravilla!

    ResponderEliminar
    Respuestas
    1. Ese problema también lo tenía otro que se pasó por aquí.

      Te digo lo mismo que le dije al otro, no sé a que puede ser debido, prueba a revisar el logcat a ver que te pone.

      Eliminar
  83. creo que el problema esta al intentar abrir la camara desde otra app... hay que inicializarla o algo! gracias x todo

    ResponderEliminar
  84. Hola, muchas gracias por el tutorial, Jstyl_8, me ha servido de mucho, de lo mejor que he visto sobre ZXing y muy currado.

    Tengo un problema, que he leído que ya ha tenido alguién más pero no he sabido resolver.

    Llamo correctamente al scanner y scaneo en mi caso un barcode 1D . El problema es que se me queda la pantalla en la que te muestra los botones: Búsqueda Web, Compartir por correo electrónico y Compartir por SMS. Obtengo ResultCode = 0 y no me guarda el barcode leído por lo que pierdo la información. He leído por arriba que al leer el código regresa instantaneamente al anterior Activity, cosa que a mi no me sucede...

    Otra duda, hay alguna forma de en esta pantalla introducir mis propios botones??

    Gracias por atenderme.
    Un saludo!

    ResponderEliminar
    Respuestas
    1. Al ser otro tipo de código y no un QR quizás el comportamiento es distinto, pero lo que yo he probado siempre al escanear el código vuelve al activity que lo llamó, así es el comportamiento del startActivityForResult().

      Prueba a revisar el código del CaptureActivity del zxing a ver si es que lanza otra actividad antes de volver a la inicial, aunque que yo recuerde no lo hacía.

      Modificar el layout de la aplicación de la cámara es complicao por lo que sé, pero sí se puede, aunque yo recomiendo dejar eso quieto y añadir lo que sea en las que tu hagas a partir de la información que te devuelve el zxing.

      Eliminar
    2. Ya lo he solucionado. El problema era que ponía en el Manifest la carpeta de SCAN de mi aplicación en vez de la del proyecto ZXing original y nunca entraba en el Handler de CaptureActivity.

      Gracias por todo, tienes un nuevo seguidor del blog!!
      jajaj

      Eliminar
  85. Estoy empezando a realizar una aplicación y ésto me ha venido de perlas. Gracias por este gran aporte compañero.

    xplicando.blogspot.com

    ResponderEliminar
  86. excelente tutorial. necesito hacer una aplicacion que me ejecute el barcode scanner y el resultado del qr code me lo mande a el edit text de otra activity. como seria?desde ya muy agradecido!!!

    ResponderEliminar
    Respuestas
    1. En el tutorial tienes como hacer que una activity llame al lector y el resultado vaya a esa misma que lo ha llamado.

      Si quieres que vaya a otra cuando tengas el resultado en la Activity inicial lanza otra con esa información del qr code y listo.

      Eliminar
  87. Hola, estoy viendo esta libreria, y me esta tirando un error peculiar.

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

    Creo haber seguido correctamente el tutorial y la verdad no ecnuentro el problema. SI a alguien le paso lo mismo y me quiere dar una mano, estaría buenísimo.

    Saludos

    ResponderEliminar

Ponte un nombre aunque sea falso, que Anó-nimo queda mu feo :(