個人博客:haichenyi.com。感謝關注
??做過二維碼掃描的童鞋都知道姓惑,要用Zxing操灿,可是google官方推的Zxing,我們集成掃描的時候很慢拐纱,有時候就直接掃不出來铜异,體驗太差了。因為他適配了太多東西秸架,我們只要一個掃描功能揍庄,然后就去網(wǎng)上搜索,怎么使zxing掃描變的很快东抹,zxing的優(yōu)化蚂子,然后跟著網(wǎng)上的博客,一步一步走缭黔,即使最終做完了食茎,感覺體驗還是不夠好。我這里推薦一個二維碼掃描的開源框架——BGAQRCode-Android
??QRCode 掃描二維碼馏谨、掃描條形碼别渔、相冊獲取圖片后識別、生成帶 Logo 二維碼田巴、支持微博微信钠糊、QQ 二維碼掃描樣式挟秤。他把Zbar和Zxing壹哺,都做了優(yōu)化,掃描速度非乘腋眨快管宵,用戶體驗很好,用起來也非常方便
依賴
implementation 'cn.bingoogolapple:bga-qrcode-zbar:1.2.1'
或者
implementation 'cn.bingoogolapple:bga-qrcode-zxing:1.2.1'
用法
以Zbar為例(Zxing類似)
第一步:XML文件
<cn.bingoogolapple.qrcode.zbar.ZBarView
android:id="@+id/zbarview"
style="@style/MatchMatch"
app:qrcv_animTime="1000"
app:qrcv_borderColor="@android:color/white"
app:qrcv_borderSize="1dp"
app:qrcv_cornerColor="@color/colorPrimaryDark"
app:qrcv_cornerLength="20dp"
app:qrcv_cornerSize="3dp"
app:qrcv_isShowDefaultScanLineDrawable="true"
app:qrcv_maskColor="#33FFFFFF"
app:qrcv_rectWidth="200dp"
app:qrcv_scanLineColor="@color/colorPrimaryDark"
app:qrcv_topOffset="90dp" />
自定義屬性說明
屬性名 | 說明 | 默認值 |
---|---|---|
qrcv_topOffset | 掃描框距離 toolbar 底部的距離 | 90dp |
qrcv_cornerSize | 掃描框邊角線的寬度 | 3dp |
qrcv_cornerLength | 掃描框邊角線的長度 | 20dp |
qrcv_cornerColor | 掃描框邊角線的顏色 | @android:color/white |
qrcv_rectWidth | 掃描框的寬度 | 200dp |
qrcv_barcodeRectHeight | 條碼掃樣式描框的高度 | 140dp |
qrcv_maskColor | 除去掃描框攀甚,其余部分陰影顏色 | #33FFFFFF |
qrcv_scanLineSize | 掃描線的寬度 | 1dp |
qrcv_scanLineColor | 掃描線的顏色「掃描線和默認的掃描線圖片的顏色」 | @android:color/white |
qrcv_scanLineMargin | 掃描線距離上下或者左右邊框的間距 | 0dp |
qrcv_isShowDefaultScanLineDrawable | 是否顯示默認的圖片掃描線「設置該屬性后 qrcv_scanLineSize 將失效箩朴,可以通過 qrcv_scanLineColor 設置掃描線的顏色,避免讓你公司的UI單獨給你出特定顏色的掃描線圖片」 | false |
qrcv_customScanLineDrawable | 掃描線的圖片資源「默認的掃描線圖片樣式不能滿足你的需求時使用秋度,設置該屬性后 qrcv_isShowDefaultScanLineDrawable炸庞、qrcv_scanLineSize、qrcv_scanLineColor 將失效」 | null |
qrcv_borderSize | 掃描邊框的寬度 | 1dp |
qrcv_borderColor | 掃描邊框的顏色 | @android:color/white |
qrcv_animTime | 掃描線從頂部移動到底部的動畫時間「單位為毫秒」 | 1000 |
qrcv_isCenterVertical | 掃描框是否垂直居中荚斯,該屬性為true時會忽略 qrcv_topOffset 屬性 | false |
qrcv_toolbarHeight | Toolbar 的高度埠居,通過該屬性來修正由 Toolbar 導致掃描框在垂直方向上的偏差 | 0dp |
qrcv_isBarcode | 是否是掃條形碼 | false |
qrcv_tipText | 提示文案 | null |
qrcv_tipTextSize | 提示文案字體大小 | 14sp |
qrcv_tipTextColor | 提示文案顏色 | @android:color/white |
qrcv_isTipTextBelowRect | 提示文案是否在掃描框的底部 | false |
qrcv_tipTextMargin | 提示文案與掃描框之間的間距 | 20dp |
qrcv_isShowTipTextAsSingleLine | 是否把提示文案作為單行顯示 | false |
qrcv_isShowTipBackground | 是否顯示提示文案的背景 | false |
qrcv_tipBackgroundColor | 提示文案的背景色 | #22000000 |
qrcv_isScanLineReverse | 掃描線是否來回移動 | true |
qrcv_isShowDefaultGridScanLineDrawable | 是否顯示默認的網(wǎng)格圖片掃描線 | false |
qrcv_customGridScanLineDrawable | 掃描線的網(wǎng)格圖片資源 | null |
qrcv_isOnlyDecodeScanBoxArea | 是否只識別掃描框區(qū)域的二維碼 | false |
第二步:獲取控件,并實現(xiàn)QRCodeView.Delegate接口
QRCodeView mQRCodeView = (ZBarView) findViewById(R.id.zbarview);
mQRCodeView.setDelegate(this);
@Override
public void onScanQRCodeSuccess(String result) {
vibrate();
Toast.makeText(this,result,Toast.LENGTH_SHORT).show();
mQRCodeView.startSpot();
}
@Override
public void onScanQRCodeOpenCameraError() {
Toast.makeText(this,"錯誤",Toast.LENGTH_SHORT).show();
}
第四步:實現(xiàn)onStart事期,onStop滥壕,onDestroy方法
@Override
protected void onStart() {
super.onStart();
mQRCodeView.startCamera();//打開相機
mQRCodeView.showScanRect();//顯示掃描框
mQRCodeView.startSpot();//開始識別二維碼
//mQRCodeView.openFlashlight();//開燈
//mQRCodeView.closeFlashlight();//關燈
}
@Override
protected void onStop() {
mQRCodeView.stopCamera();
super.onStop();
}
@Override
protected void onDestroy() {
mQRCodeView.onDestroy();
super.onDestroy();
}
private void vibrate() {
Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
vibrator.vibrate(200);
}
第五步:添加權(quán)限
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.VIBRATE"/>
經(jīng)過上面5步,掃描功能就已經(jīng)出來了兽泣,Zbar掃描比Zxing快绎橘,Zbar是基于C實現(xiàn)的,Zxing是基于C++唠倦。有個問題就是Zbar無法生成二維碼称鳞,如果你是集成的BGA的Zxing可以生成二維碼涮较。Zxing生成二維碼的方式如下:
耗時操作,新開線程
//中文
Bitmap bitmap = QRCodeEncoder.syncEncodeQRCode("海晨憶", BGAQRCodeUtil.dp2px(this, 150));
//帶logo
Bitmap logoBitmap = BitmapFactory.decodeResource(TestGeneratectivity.this.getResources(), R.mipmap.logo);
QRCodeEncoder.syncEncodeQRCode("海晨憶", BGAQRCodeUtil.dp2px(TestGeneratectivity.this, 150), Color.parseColor("#ff0000"), logoBitmap);
解析圖片二維碼
//mEnglishLogoIv:顯示二維碼的控件
mEnglishLogoIv.setDrawingCacheEnabled(true);
Bitmap bitmap = mEnglishLogoIv.getDrawingCache();
//返回二維碼圖片里的內(nèi)容 或 null
String result = QRCodeDecoder.syncDecodeQRCode(bitmap);
String result = QRCodeDecoder.syncDecodeQRCode(picturePath);