2012-06-13 27 views
11

Sto utilizzando con successo zxing per eseguire la scansione dei codici, richiamando l'intento del lettore di codici a barre installato, ma quando emette un segnale acustico e indica una buona scansione mi aspetto che l'attività di zxing restituisca il controllo può elaborare il risultato, ma si trova lì e prova a eseguire nuovamente la scansione. Devo premere il pulsante Indietro e quindi restituire e posso fare il passo successivo. C'è qualche bandiera evidente che mi manca quando chiamo lo scanner?android: scansione del codice a barre zxing riuscita ma non di ritorno dall'attività

Qualsiasi consiglio ricevuto con gratitudine. Grazie molto.

Ecco il mio codice:

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

risposta

4

Perché non utilizzare la classe IntentIntegrator fornita? Questo è l'unico approccio menzionato nei documenti del progetto, hai dato un'occhiata a quelli? https://github.com/zxing/zxing/wiki/Scanning-Via-Intent

L'ho creato per concludere questi dettagli di invio e analisi dell'Intent, in modo da non fare errori di battitura. Ad esempio, non esiste "extra" com.google.zxing.client.android.SCAN.SCAN_MODE ".

+0

Scusate Sean, I'm noob: import com.google.zxing.integration.android.IntentIntegrator; non funziona poichè com.google non può essere risolto. Mi manca un link da qualche parte? Grazie molto. – Barry

+0

OK, tutto funziona! Scusa, non avevo capito che intendevi aggiungere due intere classi alla mia app (IntentIntegrator e IntentResult). Il piano originale, utilizzare circa 10 linee di codice per chiamare lo scanner installato era l'ideale se avessi potuto trovare un modo per farlo funzionare. In questo modo aggiorna lo scanner = aggiorna anche la mia app, in questo modo devo tenere d'occhio le tue modifiche manualmente :(La cosa che hai detto non esiste venuta da [link] (http://stackoverflow.com/questions/2050263/using-zxing-per-creare-un'applicazione-android-scansione-codice-bar) - una conversazione in cui sei stato coinvolto lo scorso anno Grazie per l'aiuto – Barry

1

Aggiungere finishActivity (requestCode); alla fine del metodo onActivityResult().

Provare questo: Sostituire le prime 2 linee in onTouch con il codice riportato di seguito. Sembra che il problema sia durante la scansione di codici diversi da QR. Si prega di rimuovere il filtro di scansione e controllare una volta.

Intento intento = nuovo intento ("com.google.zxing.client.android.SCAN"); intent.addFlags (Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);

+0

Scusa Alfi, questo è * dopo * il problema. L'esecuzione non raggiunge mai "// gestisce la scansione riuscita" finché non premo il tasto Indietro. Sembra che si stia eseguendo il loop della scansione stessa e non passa mai il controllo al mio codice. – Barry

+0

Stai eseguendo la scansione solo dei codici QR, come mostra il codice? Se provi a scansionare 1D e Matrix, continua a mostrare i punti verdi senza effettivamente scansionare nulla. – Alfred

+0

Con il codice sopra riportato scansiona con successo QR ed EAN13, ma questo è il mio primo tuffo in zxing, quindi qualsiasi altro suggerimento è ben accetto, ma il mio problema principale è far sì che zxing lasci andare quando ottiene un buon risultato. – Barry

10

Ecco la risposta piena alla mia domanda, spero che questo aiuta qualcuno:

Go here e copiare l'intera classe IntentIntegrator, aggiungerlo alla vostra applicazione; vai anche a here e copia la classe IntentResult nella tua app. Ora aggiungere questo alla vostra attività (o attivare la scansione da un pulsante/altro):

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

Sarebbe stato bello basta chiamare i servizi forniti dal l'applicazione dello scanner di codici a barre e non copiare e incollare pezzi di codice in la tua app ma questo sembra essere il modo consigliato :(

+0

Non sono sicuro di aver capito il tuo ultimo commento. è la quantità minima di codice che è possibile copiare e incollare poiché si utilizza la libreria di integrazione fornita. Spiacenti, non può essere 0 righe. Non è possibile utilizzare la libreria di integrazione, ma poi si riscriverà il codice, che è forse decine di linee, certo, ma questo è più. Certo, fallo se vuoi - qual è la differenza tra reinventare il codice necessario e copiare il codice necessario fornito? –

+0

Scusa Sean, non volevo lamentarmi (probabilmente ho fatto - è stata una lunga giornata, mi scuso). La mia pugnalata originale, copiata da una precedente risposta qui, era linee che hanno utilizzato l'intento offerto dalla tua app, che sarebbe stato perfetto. Si consiglia di utilizzare IntentIntegrator, che è un percorso diverso e, naturalmente, funziona perfettamente. Il mio primo hack era * così vicino * - se avessi avuto il tuo intento di rilasciarlo dopo una scansione riuscita avrei ottenuto la funzionalità su 10 righe, invece di aggiungere 500 righe e due classi. Saluti, B. – Barry

1

Avevo lo stesso problema, quindi ho provato a utilizzare la classe IntentIntegrator come consigliato da Sean Owen. Avevo ancora il problema fino a quando non mi sono reso conto che ciò accadeva solo quando provavo per scansionare un codice a barre in verticale (più frequentemente sui telefoni) .Si scopre che il cambio di orientamento da verticale a orizzontale causa la doppia scansione. Ho risolto questo problema aggiungendo android:configChanges="orientation|keyboardHidden|screenSize" all'attività nel mio manifesto. Probabilmente hai solo bisogno dell'orientamento, ma non è stato verificato.

Per gli utenti che riscontrano questo problema durante la creazione di un'estensione nativa di Adobe AIR, assicurarsi di aggiungere tale linea non solo al manifesto del progetto Android, ma anche al tag attività nelle aggiunte manifest Android nel proprio app.xml.

+0

È utile se l'attività da cui si avvia CaptureActivity è in modalità orizzontale. Ho aggiunto 'android: screenOrientation =" landscape "' a quell'attività nel Manifest. Che ha funzionato per me. – Christine

0

Ecco la soluzione che sto utilizzando. Funziona bene per me.

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

     } 
    } 
Problemi correlati