程序源代碼及可執行文件下載地址:http://files.cnblogs.com/rainboy2010/zbardemo.zip
Android下常用的條碼掃描類庫有zxing和zbar,比較了一下,發現zbar掃描速度更快,能夠識別的條碼類型更多,下面就講解一下如何利用zbar實現掃一掃,先放上一張效果圖:
主要代碼如下:
1.在onPreviewFrame方法里獲取預覽圖像,然后傳遞給DecodeHandler去解析
@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類庫對圖像進行解析
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(); } }