显示对话框时暂停QR码检测

时间:2016-04-11 01:08:37

标签: android qr-code android-dialogfragment

我正在尝试创建一个实时QR码解码器,它允许用户确认/取消从摄像机视图读取的数据。 (当然,根据确认或取消,它将执行一些代码......)

但有一个坏点: 我编码的应用程序即使在对话框中也会继续读取qr代码数据,但我找不到阻止它的方法。

这是我的主要活动:

public class MainReadActivity extends Activity {


private SurfaceView cameraView;
private TextView barcodeInfo;
private BarcodeDetector barcodeDetector;
private CameraSource cameraSource;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_read);

    DisplayMetrics dm = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(dm);


    cameraView = (SurfaceView) findViewById(R.id.camera_view);

    cameraView.requestFocus();
    barcodeInfo = (TextView) findViewById(R.id.code_info);

    barcodeDetector = new BarcodeDetector.Builder(this).setBarcodeFormats(Barcode.QR_CODE).build();


    cameraSource = new CameraSource.Builder(this, barcodeDetector).build();


    cameraView.getHolder().addCallback(new SurfaceHolder.Callback() {

        @Override
        public void surfaceCreated(SurfaceHolder holder) {


            try {
                cameraSource.start(cameraView.getHolder());
            } catch (IOException ie) {
                Log.e("CAMERA SOURCE", ie.getMessage());
            }

        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            cameraSource.stop();
        }
    });


    barcodeDetector.setProcessor(new Detector.Processor<Barcode>() {
        @Override
        public void release() {
        }

        @Override
        public void receiveDetections(Detector.Detections<Barcode> detections) {
            final SparseArray<Barcode> barcodes = detections.getDetectedItems();

            if (barcodes.size() != 0) {
                barcodeInfo.post(new Runnable() {    // Use the post method of the TextView
                    public void run() {

                        ConfirmationDialogFragment myDialog = new ConfirmationDialogFragment();
                        myDialog.show(getFragmentManager(),"");
                        barcodeInfo.setVisibility(View.VISIBLE);
                        barcodeInfo.setText(barcodes.valueAt(0).displayValue);
                    }
                });
            }
        }
    });



}

这是我的DialogFragment:

public class ConfirmationDialogFragment extends DialogFragment {



public Dialog ConfirmationDialogFragment(Bundle savedInstanceState){

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    LayoutInflater inflater = getActivity().getLayoutInflater();
    View v = inflater.inflate(R.layout.dialog_confirmation,null);
    builder.setView(v);


    Dialog dialog = builder.create();

    return dialog;
}
}

任何人都可以帮助我吗?

贝斯茨, P上。

2 个答案:

答案 0 :(得分:0)

我认为你忘记了这样的事情。

builder.setPositiveButton(Ok, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss(); //this close the dialog.
        }

    });
    builder.setNegativeButton(Back, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            ///do another thing
        }
    });

我希望这可以帮到你

答案 1 :(得分:0)

检测到后只需调用 Camera.release()方法

@Override
 public void receiveDetections(Detector.Detections < TextBlock > detections) {
  final SparseArray < TextBlock > items = detections.getDetectedItems();
  if (items.size() != 0) {

   mTextView.post(new Runnable() {
    @Override
    public void run() {
     StringBuilder stringBuilder = new StringBuilder();
     for (int i = 0; i < items.size(); i++) {
      TextBlock item = items.valueAt(i);
      stringBuilder.append(item.getValue());
      stringBuilder.append("\n");
     }
     mTextView.setText(stringBuilder.toString());
     mCameraSource.release();

    }
   });
  }
 }