Android:Barcode Scanner的AlertDialog.builder出现两次

问题描述

成功扫描并获取条形码数据后,我想显示AlertDialog。然后,当我单击OK上的AlertDialog按钮时,它将继续再次扫描条形码。除AlertDialog之外,其他所有设备都工作正常,同时扫描了数据并显示AlertDialog,但显示了两次。我只想显示一个

工作流程是首先createCameraSource(),然后扫描条形码,然后显示名为AlertDialog的{​​{1}}函数,然后再次打开相机dialogRack(String ..)并扫描条形码并显示openCameraAgain()函数名为AlertDialogdialogItem(String ..)功能出现后,AlertDialog出现了两次

openCameraAgain()

createCameraSource()

private void createCameraSource() { barcodeDetector = new BarcodeDetector.Builder(this) .setBarcodeFormats(Barcode.ALL_FORMATS) .build(); surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(@NonNull SurfaceHolder holder) { if (ActivityCompat.checkSelfPermission(getApplicationContext(),Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) { int width = surfaceView.getWidth(); int height = surfaceView.getHeight(); cameraSource = new CameraSource.Builder(ScanActivity.this,barcodeDetector) .setRequestedPreviewSize(height,width) .setAutoFocusEnabled(true) .build(); try { cameraSource.start(surfaceView.getHolder()); } catch (IOException e) { e.printstacktrace(); } } else { ActivityCompat.requestPermissions(ScanActivity.this,new String[]{Manifest.permission.CAMERA},REQUEST_CAMERA_PERMISSION); //CAMERA_CAPTURE_PERMISSIONS_REQUEST_CODE } } @Override public void surfaceChanged(@NonNull SurfaceHolder holder,int format,int width,int height) { } @Override public void surfaceDestroyed(@NonNull 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 && !decoded) { decoded = true; try { intentData = URLDecoder.decode(barcodes.valueAt(0).displayValue,"UTF-8"); runOnUiThread(new Runnable() { @Override public void run() { cameraSource.stop(); barcodeDetector.release(); dialogRack(intentData); } }); } catch (UnsupportedEncodingException e) { e.printstacktrace(); } } //End of if } }); } // End of createCameraSource function

dialogRack(final String rackNumber)

private void dialogRack(final String rackNumber) { Log.i("Alert Dialog","Alert Dialog created for Rack Scanned"); AlertDialog.Builder alertDialog = new AlertDialog.Builder(ScanActivity.this); alertDialog.setTitle("Rack") .setMessage("Rack Number : " + rackNumber) .setPositiveButton("OK",new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog,int which) { tvRack.setText(rackNumber); openCameraAgain(); } }).create().show(); }

openCameraAgain()

private void openCameraAgain(){ Log.i("Camera Scan","openCamera() start"); if (ActivityCompat.checkSelfPermission(getApplicationContext(),Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { return; } try { cameraSource.start(surfaceView.getHolder()); } catch (IOException e) { e.printstacktrace(); } barcodeDetector.setProcessor(new Detector.Processor<Barcode>() { @Override public void release() { } @Override public void receiveDetections(Detector.Detections<Barcode> detections) { //Start scanning for item final SparseArray<Barcode> itemBarCode = detections.getDetectedItems(); if (itemBarCode.size() != 0) { try { intentData = URLDecoder.decode(itemBarCode.valueAt(0).displayValue,"UTF-8"); runOnUiThread(new Runnable() { @Override public void run() { cameraSource.stop(); barcodeDetector.release(); Log.i("Camera Close","Camera Source Stop,Barcode Detector Off"); dialogItem(intentData); } }); } catch (UnsupportedEncodingException e) { e.printstacktrace(); } } //End of if } }); }

dialogItem(final String itemNumber)

解决方法

AlertDialog两次,因为您需要在单击alertDialog的ok按钮时关闭dialogItem对话框。否则,您没有机会单击 ok 按钮,而不会得到 AlertDialog

因此在DialogItem上单击OK

private void dialogItem(final String itemNumber){
    Log.i("Alert Dialog","Alert Dialog created for Item Scanned");
    AlertDialog.Builder alertDialog = new AlertDialog.Builder(ScanActivity.this);
    alertDialog.setTitle("Item")
            .setMessage("Scanned Item Number : " + itemNumber)
            .setPositiveButton("OK",new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog,int which) {
                    try {
  //CANCEL YOUR ALERT DIALOG HERE BEFORE OPENCAMERA 
                        arrayListSerialNumber.add(itemNumber);
                        adapter.notifyDataSetChanged();
                        openCameraAgain();
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                }
            }).create().show();

}

,

好吧,我使用static解决了创建AlertDialog的问题。

static AlertDialog dialog;
static AlertDialog.Builder alertDialog;

显示对话框功能,创建对话框并显示

private void dialogRack(final String rackNumber) {
    alertDialog = new AlertDialog.Builder(ScanActivity.this);
    alertDialog.setTitle("Title")
            .setMessage("Message")
            .setPositiveButton("OK",int which) {
                   // onClick Function
                }
            });
    dialog = alertDialog.create();
    dialog.show();
} //end of dialogRack

为确保点击后将您的dialog解雇,您可以使用下面的if-else语句,

if(dialog != null && dialog.isShowing()){
  //Action or wait for dismiss
}else{
  //Dialog is closed
}