2014-09-10 4 views
2

나는 ZBar 안드로이드 라이브러리를 사용하여 QR 코드를 스캔하고 있습니다. 지금까지 코드가 스캔되고 스캔 결과가 textView에 표시됩니다. qr 코드를 스캔하고 이에 따라 조치를 실행하는 다른 앱처럼 코드가 스캔 될 때 작업을 트리거하려고합니다. 여기Android 용 ZBAR을 사용하여 QR 코드 스캔 작업을 트리거하는 방법은 무엇입니까?

public class CameraTestActivity extends Activity 
{ 
    private Camera mCamera; 
    private CameraPreview mPreview; 
    private Handler autoFocusHandler; 

    TextView scanText; 
    Button scanButton; 

    ImageScanner scanner; 

    private boolean barcodeScanned = false; 
    private boolean previewing = true; 

    static { 
     System.loadLibrary("iconv"); 
    } 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.main); 

     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

     autoFocusHandler = new Handler(); 
     mCamera = getCameraInstance(); 

     /* Instance bar code scanner */ 

     scanner = new ImageScanner(); 
     scanner.setConfig(0, Config.X_DENSITY, 3); 
     scanner.setConfig(0, Config.Y_DENSITY, 3); 

     mPreview = new CameraPreview(this, mCamera, previewCb, autoFocusCB); 
     FrameLayout preview = (FrameLayout)findViewById(R.id.cameraPreview); 
     preview.addView(mPreview); 

     scanText = (TextView)findViewById(R.id.scanText); 

     scanButton = (Button)findViewById(R.id.ScanButton); 

     scanButton.setOnClickListener(new OnClickListener() { 
       public void onClick(View v) { 
       if (barcodeScanned) { 
        barcodeScanned = false; 
        scanText.setText("Scanning..."); 
        mCamera.setPreviewCallback(previewCb); 
        mCamera.startPreview(); 
        previewing = true; 
        mCamera.autoFocus(autoFocusCB); 
        } 
       } 
      }); 
    } 

    public void onPause() { 
     super.onPause(); 
     releaseCamera(); 
    } 

    /** A safe way to get an instance of the Camera object. */ 
    public static Camera getCameraInstance(){ 
     Camera c = null; 
     try { 
      c = Camera.open(); 
     } catch (Exception e){ 
     } 
     return c; 
    } 

    private void releaseCamera() { 
     if (mCamera != null) { 
      previewing = false; 
      mCamera.setPreviewCallback(null); 
      mCamera.release(); 
      mCamera = null; 
     } 
    } 

    private Runnable doAutoFocus = new Runnable() { 
      public void run() { 
       if (previewing) 
        mCamera.autoFocus(autoFocusCB); 
      } 
    }; 

    PreviewCallback previewCb = new PreviewCallback() { 
     public void onPreviewFrame(byte[] data, Camera camera) { 
      Camera.Parameters parameters = camera.getParameters(); 
      Size size = parameters.getPreviewSize(); 

      Image barcode = new Image(size.width, size.height, "Y800"); 
      barcode.setData(data); 

      int result = scanner.scanImage(barcode); 

      if (result != 0) { 
       previewing = false; 
       mCamera.setPreviewCallback(null); 
       mCamera.stopPreview(); 

       SymbolSet syms = scanner.getResults(); 

       for (Symbol sym : syms) { 
        scanText.setText("barcode result " + sym.getData()); 
        barcodeScanned = true; 
       } 
      } 
     } 
    }; 

    // Mimic continuous auto-focusing 
    AutoFocusCallback autoFocusCB = new AutoFocusCallback() { 
      public void onAutoFocus(boolean success, Camera camera) { 
       autoFocusHandler.postDelayed(doAutoFocus, 1000); 
     } 
     }; 
    } 
+0

당신이 콜백 함수에 구성 핸들러 클래스를 시도를? – Tejas

+0

아니요. 예를 들려 줄 수 있습니까? 처음으로이 라이브러리를 사용하고 있습니다. –

+0

이 라이브러리를 사용해보십시오. [link] (https://github.com/dm77/barcodescanner) 조각 지원 기능도 있습니다. – Tejas

답변

0

이 시도 내 구현, 난 zbar을 사용하고 성공적인 스캔에 경고 대화 트리거하기 위해이 코드를 사용했다 :

public void onActivityResult(int requestCode, int resultCode, Intent intent) { 
    if (requestCode == 0) { 
     if (resultCode == getActivity().RESULT_OK) { 
      // Handle successful scan 
      String contents = intent.getStringExtra("SCAN_RESULT"); 
      //contents has your scanned string 
      //you can trigger your action here 


     } else if (resultCode == getActivity().RESULT_CANCELED) { 
      // Handle cancel 
     } 
    } 
}