2016-04-11 19 views
2

カメラのビューから読み取ったデータを確認/取り消すためのリアルタイムQRコードデコーダを作成しようとしています。 (もちろん、確認またはキャンセルをよると、それはいくつかのコードを実行します...)ダイアログが表示されているときに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.

答えて

1

停止を願っていますし、あなたが正しいbarcodeDetectorコールバック

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

Thanks @André! cameraSource.start(cameraView.getHolder())が私の問題を修正しました!ありがとう、揺れ続ける。 –

+0

'cameraSource.stop()'を呼び出すと、BarcodeDetector Processorは 'receiveDetections'メソッドのコードの残りの処理を停止することが判明しました。 – Dagmar

+0

https://stackoverflow.com/a/41024780/1912127 – Dagmar

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

私はこのヘルプあなたは

+0

上でカメラを起動します。しかし残念なことに問題は解決されませんでした。 実行可能ファイル(更新済み)を実装している私のpublic {void receiveDetections}を見てください... –

関連する問題