2012-06-13 7 views
11

Ich bin erfolgreich mit zxing, um Codes zu scannen, durch Aufruf der installierten Barcode-Leser Absicht, aber wenn es piept und zeigt einen guten Scan ich erwarte die zxing Aktivität würde die Kontrolle zurückgeben, damit ich kann das Ergebnis verarbeiten, aber es sitzt dort und versucht erneut zu scannen. Ich muss die Zurück-Taste drücken und dann es zurückkehrt und ich kann den nächsten Schritt tun. Gibt es eine offensichtliche Flagge, die ich vermisse, wenn ich den Scanner anrufe?Android: zxing Barcode-Scan erfolgreich, aber nicht von der Aktivität

Alle Ratschläge dankbar erhalten. Danke vielmals.

Hier ist mein Code:

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

Antwort

4

Warum nicht die mitgelieferte IntentIntegrator Klasse verwenden? Dies ist der einzige Ansatz, der in den Projektunterlagen erwähnt wird, haben Sie sich diese angesehen? https://github.com/zxing/zxing/wiki/Scanning-Via-Intent

Ich habe es erstellt, um diese Details des Sendens und Parsing der Intent abzuschließen, so dass Sie keine Tippfehler machen. Zum Beispiel gibt es keine extra "com.google.zxing.client.android.SCAN.SCAN_MODE".

+0

Sorry Sean, ich bin noob: import com.google.zxing.integration.android.IntentIntegrator; schlägt fehl, da com.google nicht aufgelöst werden kann. Fehle ich irgendwo einen Link? Danke vielmals. – Barry

+0

OK, alles funktioniert! Tut mir leid, ich wusste nicht, dass du zwei ganze Klassen zu meiner App hinzufügen willst (IntentIntegrator und IntentResult). Der ursprüngliche Plan, etwa 10 Codezeilen zu verwenden, um den installierten Scanner aufzurufen, war ideal, wenn ich einen Weg gefunden hätte, um es zum Laufen zu bringen. Auf diese Weise Updates an den Scanner = Updates für meine App auch, so muss ich Ihre Änderungen manuell im Auge behalten :(Das, was Sie gesagt haben, existiert nicht von [link] (http://stackoverflow.com/questions/2050263/using-zxing-zum-erstellen-einer-android-barcode-scanning-app) - ein Gespräch, an dem du letztes Jahr beteiligt warst Danke für die Hilfe – Barry

1

hinzufügen finishActivity (requestCode); am Ende der onActivityResult() -Methode.

Versuchen Sie Folgendes: Ersetzen Sie Ihre ersten 2 Zeilen in onTouch mit dem folgenden Code. Es scheint, dass das Problem beim Scannen von Codes außer QR ist. Bitte entfernen Sie den Scanfilter und prüfen Sie einmal.

Absicht intent = neue Absicht ("com.google.zxing.client.android.SCAN"); intent.addFlags (Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);

+0

Sorry Alfi, das ist * nach * das Problem. Die Ausführung erreicht niemals "// erfolgreichen Scan", bis ich die Zurück-Taste drücke. Es sieht so aus, als würde es den Scan selbst durchlaufen und niemals die Kontrolle an meinen Code zurückgeben. – Barry

+0

Scannen Sie nur QR-Codes, wie Ihr Code zeigt? Wenn Sie versuchen, 1D und Matrix zu scannen, zeigt es weiterhin die grünen Punkte, ohne tatsächlich etwas zu scannen. – Alfred

+0

Mit dem Code oben scannt es erfolgreich QR und EAN13 etc, aber dies ist mein erster Sprung in ZXING, so dass alle anderen Zeiger willkommen sind, aber mein Hauptproblem ist ZXING loszulassen, wenn es ein gutes Ergebnis bekommt. – Barry

10

Hier ist die vollständige Antwort auf meine eigene Frage, hoffen, dass dies jemand hilft:

Go here und die ganze IntentIntegrator Klasse zu kopieren, fügen Sie ihn in Ihre Anwendung; Gehen Sie auch here und kopieren Sie die IntentResult-Klasse in Ihre App. Nun fügen Sie diese zu Ihrer Aktivität (oder lösen den Scan durch einen Knopf/was auch immer):

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

Es wäre toll gewesen, nur die Dienstleistungen, die von dem Barcode-Scanner-App zur Verfügung gestellt rufen und nicht kopieren und einfügen Teile des Codes in Ihre eigene App, aber das scheint der empfohlene Weg zu sein :(

+0

Ich bin mir nicht sicher, ob ich deinen letzten Kommentar verstanden habe ist die Mindestmenge an Code, die Sie kopieren und einfügen können, da Sie die mitgelieferte Integrationsbibliothek verwenden. Es kann natürlich nicht 0 Zeilen sein. Sie können die Integrationsbibliothek nicht verwenden. Aber dann werden Sie den Code neu schreiben, Das ist vielleicht mehr als zehn Zeilen, aber das ist mehr ... Sicher, tu das, wenn du magst - was ist der Unterschied zwischen der Neuerfindung des benötigten Codes und dem Kopieren des zur Verfügung gestellten Codes? –

+0

Sorry Sean, ich wollte nicht jammern (Ich habe es wahrscheinlich getan - es war ein langer Tag, ich entschuldige mich.) Mein ursprünglicher Stich, kopiert von einer früheren Antwort hier, war ein paar Zeilen, die die von Ihrer App angebotene Absicht verwendet haben, die perfekt gewesen wäre. Sie haben mir empfohlen, IntentIntegrator zu verwenden, was eine andere Route ist und natürlich funktioniert es perfekt. Mein erster Hack war * so nah * - wenn ich nach einem erfolgreichen Scan Ihre Absicht haben würde zu veröffentlichen, hätte ich die Funktionalität in 10 Zeilen, anstatt 500 Zeilen und zwei Klassen hinzuzufügen. Prost, B. – Barry

1

Ich hatte das gleiche Problem, also versuchte ich mit der IntentIntegrator-Klasse wie von Sean Owen empfohlen. Ich hatte immer noch das Problem, bis ich erkannte, dass dies nur passiert, wenn Sie es versuchen um einen Barcode im Hochformat zu scannen (am häufigsten auf Telefonen.) Es stellt sich heraus, dass die Ausrichtung von Hochformat zu Querformat den doppelten Scanvorgang verursacht. Ich habe dies durch Hinzufügen von android:configChanges="orientation|keyboardHidden|screenSize" zu der Aktivität in meinem manifestieren Sie brauchen wahrscheinlich nur die Orientierung, aber das ist nicht getestet.

Für alle Benutzer, die dieses Problem beim Erstellen einer nativen Adobe AIR-Erweiterung haben, müssen Sie diese Zeile nicht nur zu Ihrem Android-Projektmanifest hinzufügen, sondern auch zu Ihrem Aktivitäts-Tag in Ihren Android-Manifest-Hinzufügungen in Ihrer app.xml.

+0

Es hilft, wenn die Aktivität, von der Sie die CaptureActivity starten, im Querformatmodus ist. Ich habe 'android: screenOrientation = "landscape" 'zu dieser Aktivität im Manifest hinzugefügt. Was für mich funktioniert hat. – Christine

0

Hier ist die Lösung, die ich verwende. Es funktioniert gut für mich.

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

     } 
    } 
Verwandte Themen