Search code examples
androidqr-codeandroid-dialogfragment

Suspend QR code detection while dialog is shown


I'm trying to create a real time QR Code decoder which allows user to confirm/cancel data read from the camera view. (Of course, according confirmation or cancelation, it will execute some code...)

But there's a bad point: The app I coded keeps reading qr code data even while in dialog and I can't find a way to prevent it.

Here is my main activity:

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



}

And here is my 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;
}
}

Can anyone help me?

Bests, P.


Solution

  • Stop and start camera on barcodeDetector callback

    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) {
                    cameraSource.stop();
                    barcodeInfo.post(new Runnable() {    // Use the post method of the TextView
                        public void run() {
    
                            builder
                    .setMessage("Are you sure you want to reset the count?")
                    .setNegativeButton("No", new DialogInterface.OnClickListener() {    
    
                        @Override
                        public void onClick(DialogInterface arg0, int arg1) {
                            cameraSource.start(cameraView.getHolder());
    
                        }
                    })
    
                    .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
    
    
                        @Override
                        public void onClick(DialogInterface arg0, int arg1) {
                            Toast.makeText(MainActivity.this, "Did Reset!", 5).show();
    
                        }
                    })
                    .create();
                            barcodeInfo.setVisibility(View.VISIBLE);
                            barcodeInfo.setText(barcodes.valueAt(0).displayValue);
                        }
                    });
                }
            }
        });