2016-04-11 46 views
2

Kullanıcının kamera görüntüsünden okunan verileri onaylamasını/iptal etmesini sağlayan gerçek zamanlı bir QR Kod çözücü oluşturmaya çalışıyorum. (Tabii ki, onay veya iptalini göre, bazı kod çalıştırır ...)İletişim kutusu görüntülenirken QR kodu algılamayı askıya al

Ama kötü bir nokta var: Ben kodlu uygulama bile iletişim içinde iken qr kod verilerini okuma tutar ve ben bulamıyorum Bunu engelleme yolu. İşte

benim ana faaliyettir: Burada

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



} 

Ve DialogFragment geçerli:

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

kimse bana yardımcı olabilir misiniz?

İyileri, P.

cevap

1

Dur umut ve barcodeDetector callback'inde

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

Teşekkür @ André! cameraSource.start (cameraView.getHolder()) sorunumu çözdü! Teşekkürler, sallanmaya devam et. –

+0

'cameraSource.stop()' işlevinin çağrılmasının BarcodeDetector İşlemcisinin "receiveDetections" yöntemindeki kodun geri kalanını işlemeyi durdurmasına neden olduğunu buldum. – Dagmar

+0

https://stackoverflow.com/a/41024780/1912127 adresine bakın. – Dagmar

0

Ben böyle bazı unutmak düşünüyorum.

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

Ben bu yardımı size

+0

Haklısın kamerayı başlatın. Ama maalesef sorunu çözmedi. Lütfen bir runnable (UPDATED) uygulayan herkese açık {void receDetections} 'a bir göz atın ... –