Android USB串列埠攝像頭實現拍照與識別二維碼
阿新 • • 發佈:2018-12-06
二維碼現在用的超級多,其實它就是一種編碼,把字串編碼儲存成一個圖片,我們掃描圖片得到字串就解碼成功。
最有名的二維碼解析庫是 google 出品的 Zxing
,網上也有很多的封裝庫,有自定義掃描視窗等,更多庫請在這個庫中搜索 二維碼
即可
USBUVCCamera原始碼已上傳至github:https://github.com/z-jc/AndroidUSBCamera-master
裡面帶有拍照和掃碼兩個功能,主要說一下掃碼的原理及實現:
在USBCameraActivity這個activity裡面有一個回撥方法onPreviewResult(),拿到byte[] nv21Yuv這個位元組流就是當前預覽到的檢視,對這個檢視進行二維分析即可;
CodeUtils.analyzeBitmap這個方法是libzxing這個庫裡面的東西,不做多解釋;
mCameraHelper.setOnPreviewFrameListener(new AbstractUVCCameraHandler.OnPreViewResultListener() { @Override public void onPreviewResult(final byte[] nv21Yuv) { //獲取預覽圖片流 if (isFlagQrCode) { isFlagQrCode = false; new Thread(new Runnable() { @Override public void run() { YuvImage yuvImage = new YuvImage(nv21Yuv, ImageFormat.NV21, 640, 480, null); ByteArrayOutputStream bos = new ByteArrayOutputStream(nv21Yuv.length); boolean result = yuvImage.compressToJpeg(new Rect(0, 0, 640, 480), 100, bos); if (!result) { return; } byte[] buffer = bos.toByteArray(); Bitmap bmp = BitmapFactory.decodeByteArray(buffer, 0, buffer.length); //識別二維碼/條形碼 CodeUtils.analyzeBitmap(bmp, new CodeUtils.AnalyzeCallback() { @Override public void onAnalyzeSuccess(Bitmap mBitmap, final String result) { isFlagQrCode = false; Intent intent = new Intent(); intent.putExtra("qrcode", result); setResult(102, intent); USBCameraActivity.this.finish(); } @Override public void onAnalyzeFailed() {//二維碼有誤 isFlagQrCode = true; } }); } }).start(); } } });