2015-08-01 14 views
5

Ich verwende ZXing-android-Embedded (https://github.com/journeyapps/zxing-android-embedded) QR-Codes zu scannen. Ich habe die Bibliothek von Github importiert. Wenn die App startet, scannt die Kamera den Code wiederholt, solange die Kamera auf einem Barcode platziert ist. Ich möchte den Scanvorgang stoppen (aber nicht die Kameravorschau). Sobald der Barcode erkannt wurde und ein Dialogfeld mit der Schaltfläche "Bestätigen", "Abbrechen" und einem Eingabefeld angezeigt wird. Wenn der Benutzer die Taste "Bestätigen" oder "Abbrechen" drückt, sollte er erneut mit dem Scannen beginnen.So stoppen Sie kontinuierliche Scannen von zxing-Android-Embedded in Android

Ich habe barcodeView.pause(); am Anfang der decode() -Methode aufgerufen, die die Kameravorschau pausiert. Auch hinzugefügt barcodeView.resume(); innerhalb onClick Methode von "dialogConfirmClick" und "dialogCancelClick". Aber die Methode barcodeView.pause(); unterbricht sowohl das Scannen als auch die Kameravorschau.

Hier ist meine Klassen-

public class MyScanActivity extends Activity { 
    private static final String TAG = MyScanActivity.class.getSimpleName(); 

    private CompoundBarcodeView barcodeView; 
    private BeepManager beepManager; 
    private DialogInterface.OnClickListener dialogCanselClick; 
    private AlertDialog dialog; 

    private BarcodeCallback callback = new BarcodeCallback() { 
     @Override 
     public void barcodeResult(BarcodeResult result) { 
      if (result.getText() != null) { 
       handleDecode(result); 
      } 
     } 

     @Override 
     public void possibleResultPoints(List<ResultPoint> resultPoints) { 
     } 
    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Window window = getWindow(); 
     window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
     setContentView(R.layout.continuous_scan); 
     barcodeView = (CompoundBarcodeView) findViewById(R.id.barcode_scanner); 
     barcodeView.decodeContinuous(callback); 
     beepManager = new BeepManager(this); 
     dialogCancelClick = new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       barcodeView.resume();//Resume scanning 
       dialog.dismiss(); 
      } 
     }; 
    } 

    public void handleDecode(BarcodeResult rawResult) { 
     barcodeView.pause();//Pause preview 
     String result = rawResult.getText(); 

     beepManager.playBeepSoundAndVibrate(); 

     DialogInterface.OnClickListener dialogOkClick = new DialogInterface.OnClickListener() { // OK 
      // button 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 

       if (writeNote) { 
        EditText txtNote = (EditText) promptsView.findViewById(R.id.txt_dialog_note); 
        //code to merge value of txtNote with result 
       } 

       dialog.dismiss(); 
       barcodeView.resume();//Resume scanning after pressing confirm button 
       Toast.makeText(MyScanActivity.this, R.string.dialog_save_qr_alert, Toast.LENGTH_SHORT).show(); 
      } 
     }; 

     AlertDialog dialog = DialogHelper.CreateDialog(this, DialogHelper.SAVE_QR_CODE, result, dialogOkClick, dialogCancelClick, promptsView); 
     dialog.show(); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 

     barcodeView.resume(); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 

     barcodeView.pause(); 
    } 

    public void pause(View view) { 
     barcodeView.pause(); 
    } 

    public void resume(View view) { 
     barcodeView.resume(); 
    } 

    public void triggerScan(View view) { 
     barcodeView.decodeSingle(callback); 
    } 

    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     return barcodeView.onKeyDown(keyCode, event) || super.onKeyDown(keyCode, event); 
    } 
} 

Antwort

6

ich die Lösung bekommen haben. Ich poste dies, damit dies anderen helfen kann, die dieselben Zweifel haben könnten.

Anstatt barcodeView.decodeContinuous(callback); innerhalb onCreate Methode verwenden barcodeView.decodeSingle(callback);. Sobald ein QR-Code gefunden wurde, hört er auf zu scannen. Rufen Sie barcodeView.decodeSingle(callback); innerhalb Bestätigen Sie und Abbrechen Schaltfläche, um den Scan erneut zu aktivieren.