Android

Android zxing 连续扫描 再次扫描

2017-08-16  本文已影响672人  大大大寒

今天一个朋友问在使用zxing扫描得到结果后,不知道如何再次扫描
先理解一下连续扫描和再次扫描
正常情况下通过扫描得到结果后停止扫描

连续扫描:得到结果后继续扫描,类似超市扫描商品
再次扫描:得到结果后经过确认后再次扫描

两者逻辑处理有很大区别的
默认情况下逻辑

 /**
     * 扫描成功,处理反馈信息
     *
     * @param rawResult
     * @param barcode
     * @param scaleFactor
     */
    public void handleDecode(Result rawResult, Bitmap barcode, float scaleFactor) {
        inactivityTimer.onActivity();
        boolean fromLiveScan = barcode != null;
        //这里处理解码完成后的结果,此处将参数回传到Activity处理
        if (fromLiveScan) {
                 //扫描的结果
                 String result  = rawResult.getText();
        }
}

这个时候你会发现得到结果后,无法继续扫描

连续扫描:
调用restartPreviewAndDecode();
但是有缺点就是一个二维码会扫码多次

  public void handleDecode(Result rawResult, Bitmap barcode, float scaleFactor) {
        inactivityTimer.onActivity();
        boolean fromLiveScan = barcode != null;
        //这里处理解码完成后的结果,此处将参数回传到Activity处理
        if (fromLiveScan) {
                 //扫描的结果
                 String result  = rawResult.getText();
                  /*
                       do something
                  */
                  if (handler != null) {
                          handler.restartPreviewAndDecode();
                  }
        }
}

再次扫描:

先退出然后重新初始相机

 /**
     * 扫描成功,处理反馈信息
     *
     * @param rawResult
     * @param barcode
     * @param scaleFactor
     */
    public void handleDecode(Result rawResult, Bitmap barcode, float scaleFactor) {
        inactivityTimer.onActivity();
        boolean fromLiveScan = barcode != null;
        //这里处理解码完成后的结果,此处将参数回传到Activity处理
        if (fromLiveScan) {
               closeCamera();
               String result = rawResult.getText();
               /*
                    do something
               */
              new AlertDialog.Builder(this)
                    .setMessage("扫描结果"+result+"\n是否再次扫描")
                    .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                           finish();
                            dialog.dismiss();
                        }
                    }).setPositiveButton("确定", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    restartCamera();
                    dialog.dismiss();
                }
            }).setCancelable(false)
                    .create().show();
           
        }
}

private void closeCamera(){
       //完全退出
        if (handler != null) {
            handler.quitSynchronously();
            handler = null;
        }
        inactivityTimer.onPause();
        // 关闭设备相机
        cameraManager.closeDriver();
    }

 private void restartCamera(){
        viewfinderView.setVisibility(View.VISIBLE);
        SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view);
        SurfaceHolder surfaceHolder = surfaceView.getHolder();
        initCamera(surfaceHolder);
        // 恢复活动监控器
        inactivityTimer.onResume();
    }

各有各的用途 根据洗好自己选择

上一篇下一篇

猜你喜欢

热点阅读