1. 程式人生 > >Android USB串列埠攝像頭實現拍照與識別二維碼

Android USB串列埠攝像頭實現拍照與識別二維碼

二維碼現在用的超級多,其實它就是一種編碼,把字串編碼儲存成一個圖片,我們掃描圖片得到字串就解碼成功。

最有名的二維碼解析庫是 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();
                    }
                }
            });