二维码现在用的超级多,其实它就是一种编码,把字符串编码保存成一个图片,我们扫描图片得到字符串就解码成功。
最有名的二维码解析库是 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();
}
}
});