2015-08-01 9 views
5

Używam Zxing-android-wbudowany (https://github.com/journeyapps/zxing-android-embedded) do skanowania kodów QR. Zaimportowałem bibliotekę z github. Gdy aplikacja się uruchamia, kamera skanuje kod wielokrotnie, o ile kamera jest umieszczona na kodzie kreskowym. Chcę zatrzymać skanowanie (ale nie podgląd kamery) po wykryciu kodu kreskowego i wyświetlić okno dialogowe z przyciskiem "Potwierdź", przyciskiem "Anuluj" i polem wprowadzania. Kiedy użytkownik naciśnie przycisk "Potwierdź" lub "Anuluj", powinien rozpocząć skanowanie ponownie.Jak zatrzymać ciągłe skanowanie przez zxing-android-wbudowany w Android

Wywołałem barcodeView.pause(); na początku metody decode(), która zatrzymuje podgląd kamery. Ponadto dodano barcodeView.resume(); wewnątrz metody onClick "dialogConfirmClick" i "dialogCancelClick". Metoda barcodeView.pause(); wstrzymuje skanowanie, a także podgląd kamery.

Oto moja wykładowa

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

Odpowiedz

6

mam rozwiązanie. Zamieszczam to, aby pomóc innym, którzy mogą mieć te same wątpliwości.

Zamiast barcodeView.decodeContinuous(callback); wewnątrz onCreate metody wykorzystania barcodeView.decodeSingle(callback);. Po znalezieniu kodu QR przestanie on skanować. Zadzwoń pod barcodeView.decodeSingle(callback); wewnątrz Potwierdź i Anuluj, aby ponownie włączyć skanowanie.

Powiązane problemy