2015-08-01 44 views
5

Sto usando Zxing-android-embedded (https://github.com/journeyapps/zxing-android-embedded) per eseguire la scansione dei codici QR. Ho importato la libreria da github. Quando l'app si avvia, la fotocamera sta scandagliando il codice ripetutamente fino a quando la fotocamera viene posizionata su un codice a barre. Desidero interrompere la scansione (ma non l'anteprima della fotocamera) dopo aver rilevato il codice a barre e mostrare una finestra di dialogo con il pulsante "Conferma", il pulsante "Annulla" e una casella di inserimento. Quando l'utente preme il pulsante "Conferma" o "Annulla" dovrebbe ricominciare la scansione.Come interrompere la scansione continua da zxing-android-embedded in Android

Ho chiamato barcodeView.pause(); all'inizio del metodo decode() che mette in pausa l'anteprima della telecamera. Inoltre, aggiunto barcodeView.resume(); all'interno del metodo onClick di "dialogConfirmClick" e "dialogCancelClick". Ma il metodo barcodeView.pause(); mette in pausa la scansione e l'anteprima della fotocamera.

Ecco il mio classe-

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

risposta

6

Io ho la soluzione. Sto postando questo in modo che questo possa aiutare gli altri che potrebbero avere gli stessi dubbi.

Invece di utilizzare barcodeView.decodeContinuous(callback); all'interno onCreate metodo uso barcodeView.decodeSingle(callback);. Una volta trovato un codice QR, smetterà di scansionare. Chiama il numero barcodeView.decodeSingle(callback); all'interno di Conferma e Annulla il pulsante per attivare nuovamente la scansione.