2012-06-13 13 views
11

Estoy usando zxing con éxito para escanear códigos, llamando al intento del lector de código de barras instalado, pero cuando emite un pitido e indica un buen escaneo espero que la actividad zxing regrese control así que puede procesar el resultado, pero se sienta allí e intenta escanear de nuevo. Tengo que presionar el botón Atrás y luego regresa y puedo hacer el siguiente paso. ¿Hay alguna bandera obvia que me falta cuando llamo al escáner?android: zxing código de barras exitoso pero no regresó de actividad

Cualquier consejo recibido con gratitud. Muchas gracias.

Aquí está mi código:

public boolean onTouchEvent(final MotionEvent event) { 

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

    return true; 
    } 

public void onActivityResult(int requestCode, int resultCode, Intent intent) { 

    super.onActivityResult(requestCode, resultCode, intent); 

    if (requestCode == 0) { 
     if (resultCode == RESULT_OK) { 
      String contents = intent.getStringExtra("SCAN_RESULT"); 
      String format = intent.getStringExtra("SCAN_RESULT_FORMAT"); 

      // Handle successful scan 

      String s = "http://www.google.com/search?q="; 
      s += contents; 
      Intent myIntent1 = new Intent(Intent.ACTION_VIEW, Uri.parse(s)); 
      startActivity(myIntent1); 
      } 
     else 
      if (resultCode == RESULT_CANCELED) { 
       // Handle cancel 
       } 
      } 
     } 
    } 

Respuesta

4

¿Por qué no utilizar la clase proporcionada IntentIntegrator? Este es el único enfoque mencionado en los documentos del proyecto, ¿echas un vistazo a esos? https://github.com/zxing/zxing/wiki/Scanning-Via-Intent

Lo he creado para resumir estos detalles de envío y análisis de la intención, por lo que no hace errores tipográficos. Por ejemplo, no existe el "com.google.zxing.client.android.SCAN.SCAN_MODE" adicional.

+0

Lo siento Sean, soy novato: import com.google.zxing.integration.android.IntentIntegrator; está fallando porque com.google no se puede resolver. ¿Me falta un enlace en alguna parte? Muchas gracias. – Barry

+0

OK, ¡todo funciona! Lo siento, no me di cuenta de que quería decir agregar dos clases completas a mi aplicación (IntentIntegrator e IntentResult). El plan original, utilizar unas 10 líneas de código para llamar al escáner instalado era ideal si hubiera podido encontrar la manera de hacerlo funcionar. De esa forma, las actualizaciones del escáner = actualizaciones también para mi aplicación, así tengo que vigilar tus cambios manualmente :(Lo que dijiste que no existe provino de [link] (http://stackoverflow.com/questions)/2050263/using-zxing-to-create-an-android-barrade-scanning-app) - una conversación en la que estuvo involucrado el año pasado. Gracias por la ayuda. – Barry

1

Añadir finishActivity (requestCode); al final del método onActivityResult().

Pruebe esto: Reemplace sus primeras 2 líneas en onTouch con el siguiente código. Parece que el problema está en el escaneo de códigos que no sean QR. Por favor, elimine el filtro de escaneo y verifique una vez.

Intención intento = nuevo Intención ("com.google.zxing.client.android.SCAN"); intent.addFlags (Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);

+0

Lo sentimos Alfi, eso es * después * del problema. La ejecución nunca llega a // // gestionar el escaneo exitoso hasta que presiono la tecla Atrás. Parece que está bucleando el escaneo en sí mismo y nunca le devuelve el control a mi código. – Barry

+0

¿Está escaneando solo códigos QR, como muestra su código? Si tratas de escanear 1D y matriz, sigue mostrando los puntos verdes sin escanear nada. – Alfred

+0

Con el código anterior escanea con éxito QR y EAN13, etc., pero esta es mi primera inmersión en zxing, por lo que cualquier otro puntero es bienvenido, pero mi principal problema es zxing para dejarlo ir cuando obtiene un buen resultado. – Barry

10

Aquí está la respuesta completa a mi propia pregunta, espero que esto ayude a alguien:

Ir here y copiar toda la clase IntentIntegrator, agregarlo a su aplicación; también vaya al here y copie la clase IntentResult a su aplicación. Ahora agregue esto a su actividad (o activar la exploración mediante un botón/lo que sea):

public boolean onTouchEvent(final MotionEvent event) { 

    IntentIntegrator integrator = new IntentIntegrator(this); 
    integrator.initiateScan(); 

    return true; 
    } 

public void onActivityResult(int requestCode, int resultCode, Intent intent) { 
     IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent); 
     if (scanResult != null) { 
     // handle scan result 
      String s = "http://www.google.com/search?q="; 
      s += scanResult.getContents(); 

      Intent myIntent1 = new Intent(Intent.ACTION_VIEW, Uri.parse(s)); 
      startActivity(myIntent1); 
     } 
     // else continue with any other code you need in the method 
     //... 
    } 

Hubiera sido genial para llamar a los servicios prestados por la aplicación de escáner de código de barras y no copiar y pegar trozos de código en su propia aplicación, pero esta parece ser la manera recomendada :(

+0

No estoy seguro de entender su último comentario. es la cantidad mínima de código que puede copiar y pegar ya que está utilizando la biblioteca de integración proporcionada. Lo siento, no puede ser 0 líneas de curso. No puede usar la biblioteca de integración. Pero luego volverá a escribir su código, que es tal vez decenas de líneas, claro. Pero eso es más. Claro, hazlo si quieres, ¿cuál es la diferencia entre reinventar el código necesario y copiar el código que se proporciona? –

+0

Lo siento, Sean, no quise quejarse (aunque probablemente lo hice, fue un día largo, me disculpo). Mi puñalada original, copiada de una respuesta anterior aquí, fue de unos pocos líneas que utilizaron la intención ofrecida por su aplicación, que habría sido perfecto. Me recomendó que use IntentIntegrator, que es una ruta diferente y, por supuesto, funciona perfectamente. Mi primer truco fue * tan cerca *: si pudiera obtener su intención de lanzar después de un escaneo exitoso, tendría la funcionalidad en 10 líneas, en lugar de agregar 500 líneas y dos clases. Cheers, B. – Barry

1

Estaba teniendo el mismo problema, así que traté de usar la clase IntentIntegrator como lo recomienda Sean Owen. Todavía tenía el problema hasta que me di cuenta de que esto solo estaba sucediendo cuando lo intentaba para escanear un código de barras en vertical (más frecuentemente en teléfonos). Resulta que el cambio de orientación de vertical a horizontal provoca el doble escaneo. Lo resolví agregando android:configChanges="orientation|keyboardHidden|screenSize" a la actividad en mi manifiesto Probablemente solo necesites la orientación uno, pero eso no se ha probado.

Para cualquier usuario que experimente este problema al crear una extensión nativa de Adobe AIR, asegúrese de agregar esa línea no solo al manifiesto de su proyecto Android, sino también a su etiqueta de actividad en las adiciones de manifiesto de Android en su app.xml.

+0

Ayuda si la actividad desde la que inicia CaptureActivity está en modo horizontal. Agregué 'android: screenOrientation =" landscape "' a esa actividad en el Manifiesto. Lo cual funcionó para mí. – Christine

0

Aquí está la solución que estoy usando. Está funcionando bien para mí.

Intent intent = new Intent(SelectOptionActivity.this, CaptureActivity.class); 
       intent.putExtra("SCAN_MODE", "ONE_D_MODE"); 
       intent.putExtra("SCAN_FORMATS", "CODE_39,CODE_93,CODE_128,DATA_MATRIX,ITF,CODABAR,EAN_13,EAN_8,UPC_A,QR_CODE"); 
       intent.setAction(Intents.Scan.ACTION); 
       startActivityForResult(intent, 1); 


public void onActivityResult(int requestCode, int resultCode, Intent intent) { 
     if (requestCode == 1 && resultCode == RESULT_OK) { 
      final String contents = intent.getStringExtra(Intents.Scan.RESULT); 
      final String formatName = intent.getStringExtra(Intents.Scan.RESULT_FORMAT); 

     } 
    } 
Cuestiones relacionadas