Android直播帶貨系統中如何實現二維碼掃描功能

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-----> ");
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章