Android下利用zbar类库实现扫一扫

程序源代码及可执行文件下载地址:http://files.cnblogs.com/rainboy2010/zbardemo.zip

Android下常用的条码扫描类库有zxing和zbaro,比较了一下,发现zbar扫描速度更快,能够识别的条码类型更多,下面就讲解一下如何利用zbar实现扫一扫,先放上一张效果图:

Android下利用zbar类库实现扫一扫

主要代码如下:

 1.在onPreviewFrame方法里获取预览图像,然后传递给DecodeHandler去解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Override
 public void onPreviewFrame(byte[] data, Camera camera)
 {
    if (!useOneShotPreviewCallback)
    {
      camera.setPreviewCallback(null);
    }
    if(previewHandler != null)
    {
       Camera.Parameters parameters = camera.getParameters();
       Size size = parameters.getPreviewSize();
       Message message = previewHandler.obtainMessage(previewMessage, size.width,size.height, data);
       message.sendToTarget();
       previewHandler = null;
    }
    else
    {
       Log.d(TAG, "Got preview callback, but no handler for it");
    }
     
  }

2. 在decode方法里调用zbar类库对图像进行解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
private void decode(byte[] data, int width, int height) {
 
   Image barcode = new Image(width, height, "Y800");
   Rect scanImageRect = activity.getViewfinderView().getScanImageRect(height,width);
   barcode.setCrop(scanImageRect.top, scanImageRect.left, scanImageRect.bottom, scanImageRect.right);
   barcode.setData(data);
 
   int result = scanner.scanImage(barcode);
   String strResult="";
   if (result != 0)
   {
      SymbolSet syms = scanner.getResults();
      for (Symbol sym : syms)
      {
          strResult=sym.getData().trim();
          if(!strResult.isEmpty())
          {
            break;
          }
      }
   }
    
   if(!strResult.isEmpty())
   {
      Message message = Message.obtain(activity.getHandler(), R.id.decode_succeeded, strResult);//Message信息传来传去,有点绕
      Log.d(TAG, "Sending decode succeeded message...");
      message.sendToTarget();
   }
   else
   {
       Message message = Message.obtain(activity.getHandler(), R.id.decode_failed);
       message.sendToTarget();
   }
 }