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-----> ");
}

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
开发效率优化之自动化构建系统Gradle(二)上篇
阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 本篇文章将以下两个内容来介绍自动化构建系统Gradle: gradle 与 android gradle 插件的关系 Gradle Transform API 的基本使用 一、gradle 与 android gradle 插件的关系 1.1名词解释: 1.1.1,Gradle Gradle是一种构建工具,它使用一种基于Groovy的特定领域语言(DSL)来构建项目。不仅仅用于android 工程的构建。 1.1.2,Android Plugin for Gradle 这就是为了编译android 工程而开发的插件。下面就是申明Android Gradle 插件的位置。(build.gradle) buildscript { ... dependencies { classpath 'com.android.tools.build:gradle:2.2.0' } } 1.2 gradle 与 android gradle 1.2.1,gradle 各版...
-
下一篇
开发效率优化之自动化构建系统Gradle(二)下篇
11/10号文档资料已全面更新!;《【阿里P7】移动互联网架构师进阶教程+BAT面试题》,可点击下方链接直接打开:【阿里P7】移动互联网架构师进阶高级教程+BAT面试题本篇文章将继续从自定义 Gradle 插件开发来介绍自动化构建系统Gradle: Gradle 插件简介 Gradle 插件是一个能够将 Gradle 的构建逻辑(build logic)和构建任务(build task)打包到一起,以便在多个项目的构建脚本(build.gradle)中应用(apply)的工具。 例如,build.gradle 构建脚本文件内 apply plugin: 'java' 、apply plugin: 'com.android.application' 中的 java、com.android.application 就是官方提供的 Gradle 插件,通过应用这些插件,可以丰富项目的构建任务与构建逻辑。 除官方提供的插件外,Gradle 还允许开发者定义自己的 Gradle 插件。开发者可以根据实际需求定义自己的构建逻辑和构建任务,将其打包为 Gradle 插件,从而在多个项目的构建脚本中复...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS关闭SELinux安全模块
- Docker容器配置,解决镜像无法拉取问题
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS8编译安装MySQL8.0.19
- MySQL数据库在高并发下的优化方案
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程