Android直播带货系统中如何实现二维码扫描功能

简介: Android直播带货系统中如何实现二维码扫描功能李佳琦的出现将直播带货成功的引向了“巅峰”,为了响应众平台和用户的需求,开发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-----> ");
}
目录
相关文章
|
6天前
|
搜索推荐 Android开发 iOS开发
探索安卓与iOS系统的用户界面设计哲学
现代移动操作系统的设计哲学不仅仅是技术的表现,更是用户体验与功能实现的结合。本文将深入分析安卓与iOS两大主流系统在用户界面设计方面的差异与共通之处,探讨它们背后的思维模式及其对用户体验的影响。 【7月更文挑战第11天】
|
3天前
|
Android开发 Kotlin
kotlin开发安卓app,如何让布局自适应系统传统导航和全面屏导航
使用`navigationBarsPadding()`修饰符实现界面自适应,自动处理底部导航栏的内边距,再加上`.padding(bottom = 10.dp)`设定内容与屏幕底部的距离,以完成全面的布局适配。示例代码采用Kotlin。
32 15
|
27天前
|
数据库 Android开发 数据安全/隐私保护
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
70 2
|
1月前
|
存储 监控 调度
Android系统服务:WMS、AMS相关知识
参考文献 Android窗口管理服务WindowManagerService计算Activity窗口大小的过程分析 Android窗口管理服务WindowManagerService显示Activity组件的启动窗口(Starting Window)的过程分析 Android窗口管理服务WindowManagerService对输入法窗口(Input Method Window)的管理分析 Android窗口管理服务WindowManagerService显示窗口动画的原理分析
|
29天前
|
Android开发
Android中如何快速的实现RecycleView的拖动重排序功能
使用`ItemTouchHelper`和自定义`Callback`,在`RecyclerView`中实现拖动排序功能。定义`ItemTouchHelperAdapter`接口,`Adapter`实现它以处理`onItemMove`方法。`SimpleItemTouchHelperCallback`设置拖动标志,如`LEFT`或`RIGHT`(水平拖动),并绑定到`RecyclerView`以启用拖动。完成这些步骤后,即可实现拖放排序。关注公众号“AntDream”获取更多内容。
24 3
|
1月前
|
Java Linux Android开发
Android面试题之说说系统的启动流程(总结)
这篇文章概述了Android系统的启动流程,从Boot Rom到Zygote进程和SystemServer的启动。init进程作为用户级别的第一个进程,负责创建文件目录、初始化服务并启动Zygote。Zygote通过预加载资源和创建Socket服务,使用fork函数生成SystemServer进程。fork过程中,子进程继承父进程大部分信息但具有独立的进程ID。Zygote预加载资源以减少后续进程的启动时间,而SystemServer启动众多服务并最终开启Launcher应用。文中还讨论了为何从Zygote而非init或SystemServer fork新进程的原因。
33 2
|
12天前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的高校后勤网上报修系统安卓app附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的高校后勤网上报修系统安卓app附带文章源码部署视频讲解等
10 0
|
23天前
|
安全 搜索推荐 Android开发
探索安卓和iOS系统的优劣与特点
在移动操作系统领域,安卓和iOS一直是最热门的两个选择。本文将探讨安卓和iOS系统的优劣与特点,帮助读者更好地了解这两个操作系统,并为选择合适的移动设备提供参考。
24 0
|
29天前
|
存储 数据库 Android开发
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
23 0
|
1月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的安卓的微博客系统的详细设计和实现
基于SpringBoot+Vue+uniapp的安卓的微博客系统的详细设计和实现
16 0