2014-09-10 3 views
2

J'utilise la bibliothèque android ZBar pour scanner les codes QR. Jusqu'à présent, les codes sont scannés et le résultat de l'analyse est affiché dans textView. Je veux déclencher une action lorsque le code est analysé, comme d'autres applications qui analysent les codes QR et déclenchent l'action en conséquence. Voici mon implémentationComment déclencher une action sur l'analyse de code QR à l'aide de ZBAR pour Android?

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

Avez-vous essayé la classe gestionnaire qui consiste sur la fonction de rappel? – Tejas

+0

Non. Pouvez-vous donner un exemple? J'utilise cette bibliothèque pour la première fois, –

+0

Essayez cette bibliothèque. [link] (https://github.com/dm77/barcodescanner) Il a aussi un support de fragment. – Tejas

Répondre

0

Essayez, je l'avais utilisé zbar et utilisé ce code pour déclencher un message d'alerte sur une analyse réussie:

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 
     } 
    } 
} 
Questions connexes