Android直播帶貨系統中如何實作二維碼掃描功能
李佳琦的出現将直播帶貨成功的引向了“巅峰”,為了響應衆平台和使用者的需求,開發Android直播帶貨系統成為當下的開發熱潮。那麼在平時的直播軟體中,登入、分享、支付等場景中經常出現掃描二維碼的需求。接下來就以雲豹直播app中的二維碼掃描功能為例,跟大家簡單分享下怎樣搞笑、快捷、穩定的實作這個功能。
目前github上關于Android直播帶貨系統實作二維碼的庫最有名的是Google的Zxing,但是Zxing內建複雜,體積大,掃描識别比較慢,而且封裝的不好,使用不友善。這裡推薦Zbar,Zbar具有識别快,內建友善等優點。
實際開發中我們推薦使用bingoogolapple/BGAQRCode-Android 這個庫,這個是對Zbar的進一步封裝,內建使用更加友善。
1)首先将這個庫內建到項目中
compile 'cn.bingoogolapple:bga-qrcode-zbar:1.3.6'
2)在需要掃碼的activity的布局檔案中加入
<?xml version="1.0" encoding="utf-8"?>
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<include layout="@layout/view_title"/>
<cn.bingoogolapple.qrcode.zbar.ZBarView
android:id="@+id/zbarview"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:qrcv_animTime="1000"
app:qrcv_barCodeTipText="将條碼放入框内,即可自動掃描"
app:qrcv_barcodeRectHeight="120dp"
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_customGridScanLineDrawable="@mipmap/custom_grid_scan_line"
app:qrcv_isAutoZoom="true"
app:qrcv_isBarcode="false"
app:qrcv_isOnlyDecodeScanBoxArea="false"
app:qrcv_isShowDefaultGridScanLineDrawable="true"
app:qrcv_isShowDefaultScanLineDrawable="true"
app:qrcv_isShowLocationPoint="true"
app:qrcv_isShowTipBackground="true"
app:qrcv_isShowTipTextAsSingleLine="false"
app:qrcv_isTipTextBelowRect="false"
app:qrcv_maskColor="#33FFFFFF"
app:qrcv_qrCodeTipText="将二維碼/條碼放入框内,即可自動掃描"
app:qrcv_rectWidth="200dp"
app:qrcv_scanLineColor="@color/colorPrimaryDark"
app:qrcv_toolbarHeight="56dp"
app:qrcv_topOffset="80dp"
app:qrcv_verticalBias="-1"/>
3)在activity的onCreate方法中初始化掃碼控件,并設定掃碼回調。
mZBarView = findViewById(R.id.zbarview);
mZBarView.setDelegate(this);
@Override
public void onScanQRCodeSuccess(String result) {
Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
vibrator.vibrate(200);
L.e("掃碼", "掃描結果為-----> " + result);
if (!TextUtils.isEmpty(result)) {
try {
JSONObject obj = JSON.parseObject(result);
String scope = obj.getString("scope");
if (Constants.QR_CODE_SCOPE.equals(scope)) {
JSONObject data = obj.getJSONObject("data");
int type = data.getIntValue("type");
switch (type) {
case 1:
String touid = data.getString("uid");
if (!TextUtils.isEmpty(touid)) {
RouteUtil.forwardUserHome(mContext, touid);
finish();
}
break;
case 2:
String key = data.getString("key");
if (!TextUtils.isEmpty(key)) {
MainHttpUtil.loginQrCode(key, new HttpCallback() {
@Override
public void onSuccess(int code, String msg, String[] info) {
if (code == 0) {
finish();
} else {
ToastUtil.show(msg);
if (mZBarView != null) {
mZBarView.startSpot(); // 重新開始識别
}
}
}
});
}else{
if (mZBarView != null) {
mZBarView.startSpot(); // 重新開始識别
}
}
break;
}
} else {
ToastUtil.show("無效的二維碼");
if (mZBarView != null) {
mZBarView.startSpot(); // 重新開始識别
}
}
} catch (Exception e) {
ToastUtil.show("無效的二維碼");
if (mZBarView != null) {
mZBarView.startSpot(); // 重新開始識别
}
}
} else {
ToastUtil.show("無效的二維碼");
if (mZBarView != null) {
mZBarView.startSpot(); // 重新開始識别
}
}
}
4)在activity的onStart和onStop方法中分别開啟和關閉攝像頭,并且在onDestory方法中銷毀釋放攝像頭。
@Override
protected void onStart() {
super.onStart();
if (mZBarView != null) {
mZBarView.startCamera(); // 打開後置攝像頭開始預覽,但是并未開始識别
mZBarView.startSpotAndShowRect(); // 顯示掃描框,并開始識别
}
}
@Override
protected void onStop() {
if (mZBarView != null) {
mZBarView.stopCamera(); // 關閉攝像頭預覽,并且隐藏掃描框
}
super.onStop();
}
@Override
protected void onDestroy() {
if (mZBarView != null) {
mZBarView.onDestroy(); // 銷毀二維碼掃描控件
}
mZBarView = null;
MainHttpUtil.cancel(MainHttpConsts.LOGIN_QR_CODE);
super.onDestroy();
L.e("掃碼", "onDestroy-----> ");
}