如何通过zxing-android-embedded在Android中停止连续扫描

Posted

技术标签:

【中文标题】如何通过zxing-android-embedded在Android中停止连续扫描【英文标题】:How to stop continuous scanning by zxing-android-embedded in Android 【发布时间】:2015-10-24 01:22:31 【问题描述】:

我正在使用 Zxing-android-embedded(https://github.com/journeyapps/zxing-android-embedded) 来扫描二维码。我已经从 github 导入了库。当应用程序启动时,只要将相机放在条形码上,相机就会重复扫描代码。我想停止扫描(但不是相机预览)一旦检测到条形码并显示一个带有“确认”按钮、“取消”按钮和一个输入框的对话框。当用户按下“确认”或“取消”按钮时,它应该再次开始扫描。

我在 decode() 方法的开头调用了barcodeView.pause();,它暂停了相机预览。此外,在“dialogConfirmClick”和“dialogCancelClick”的onClick方法中添加了barcodeView.resume();。但是barcodeView.pause(); 方法会暂停扫描以及相机预览。

这是我的课-

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

【问题讨论】:

【参考方案1】:

我已经找到了解决方案。我发布这个是为了帮助其他可能有同样疑问的人。

不要在 onCreate 方法中使用barcodeView.decodeContinuous(callback);,而是使用barcodeView.decodeSingle(callback);。一旦找到二维码,它将停止扫描。在 ConfirmCancel 按钮内调用 barcodeView.decodeSingle(callback); 以再次激活扫描。

【讨论】:

以上是关于如何通过zxing-android-embedded在Android中停止连续扫描的主要内容,如果未能解决你的问题,请参考以下文章

如何通过android上的ADB命令通过pc拨打电话?

如何通过 DBLINK 通过 DBLINK 调用 SELECT?

如何使用jquery通过.load通过跨域获取HTML元素的值

如何通过 Windows Azure 通过 GCM 通过唯一 ID 发送特定 Android 设备的通知?

如何通过方法(不是api)通过identityserver4获取访问令牌?

如何通过主机从外部通过 SSH 连接到 VirtualBox 来宾? [关闭]