为了在云豹直播app源码中实现快速读取特定信息,并进行展示或验证的功能,最流行的解决方式非“扫描二维码”莫属。这种方式,不需要用户使用复杂的记忆跟逻辑,只需轻轻一扫,便能实现需求,在各类app中非常常用。
所以,今天来简单地介绍下在Android直播app源码中,如何快速实现显示二维码扫描并读取信息的功能
这里要介绍下,目前Android官方谷歌有自己的二维码扫描库,但是使用起来并不方便,故此在这里介绍一下云豹科技正在使用的二维码扫描库,该库在云豹直播app源码、云豹短视频源码、云豹陪玩源码、云豹语音社交源码中均有使用——“BGAQRCode-Android”,它可以实现基本的生成二维码、扫描二维码、识别图片二维码的功能
接下来介绍一下再代码层面如何使用:
首先,把 maven { url ‘https://jitpack.io’ } 添加到 root build.gradle 的 repositories 中
在 app build.gradle 中添加如下依赖,末尾的「latestVersion」指的是最新版本该库的最新版本名称,请自行替换
ZXing版本:
dependencies {
Implementation 'com.github.bingoogolapple.BGAQRCode-Android:zxing:latestVersion'
}
ZBar版本
dependencies {
implementation 'com.github.bingoogolapple.BGAQRCode-Android:zbar:latestVersion'
}
Ps:由于两个版本的侧重点不同,故提供两个版本。
然后,就是在布局文件中的使用,由于笔者习惯用ZXing版,所以下面的代码都是ZXing版的使用方法:
ZXing:
<cn.bingoogolapple.qrcode.zxing.ZXingView
android:id="@+id/zxingview"
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_maskColor="#33FFFFFF"
app:qrcv_rectWidth="200dp"
app:qrcv_scanLineColor="@color/colorPrimaryDark"
app:qrcv_scanLineSize="1dp"
app:qrcv_topOffset="90dp" />
常用到的方法有:
/**
* ZXingView 设置识别的格式。详细用法请看 zxingdemo TestScanActivity 中的 onClick 方法
*
* @param barcodeType 识别的格式
* @param hintMap barcodeType 为 BarcodeType.CUSTOM 时,必须指定该值
*/
public void setType(BarcodeType barcodeType, Map<DecodeHintType, Object> hintMap)
/**
* 设置扫描二维码的代理
*
* @param delegate 扫描二维码的代理
*/
public void setDelegate(Delegate delegate)
/**
* 显示扫描框
*/
public void showScanRect()
/**
* 隐藏扫描框
*/
public void hiddenScanRect()
/**
* 打开后置摄像头开始预览,但是并未开始识别
*/
public void startCamera()
/**
* 打开指定摄像头开始预览,但是并未开始识别
*
* @param cameraFacing Camera.CameraInfo.CAMERA_FACING_BACK or Camera.CameraInfo.CAMERA_FACING_FRONT
*/
public void startCamera(int cameraFacing)
/**
* 关闭摄像头预览,并且隐藏扫描框
*/
public void stopCamera()
/**
* 开始识别
*/
public void startSpot()
/**
* 停止识别
*/
public void stopSpot()
/**
* 停止识别,并且隐藏扫描框
*/
public void stopSpotAndHiddenRect()
/**
* 显示扫描框,并开始识别
*/
public void startSpotAndShowRect()
/**
* 打开闪光灯
*/
public void openFlashlight()
/**
* 关闭散光灯
*/
public void closeFlashlight()
/**
* 解析本地图片二维码。返回二维码图片里的内容 或 null
*
* @param picturePath 要解析的二维码图片本地路径
*/
public void decodeQRCode(String picturePath)
/**
* 解析 Bitmap 二维码。返回二维码图片里的内容 或 null
*
* @param bitmap 要解析的二维码图片
*/
public void decodeQRCode(Bitmap bitmap)
QRCodeView.Delegate 扫描二维码的代理
/**
* 处理扫描结果
*
* @param result 摄像头扫码时只要回调了该方法 result 就一定有值,不会为 null。解析本地图片或 Bitmap 时 result 可能为 null
*/
void onScanQRCodeSuccess(String result)
/**
* 摄像头环境亮度发生变化
*
* @param isDark 是否变暗
*/
void onCameraAmbientBrightnessChanged(boolean isDark);
/**
* 处理打开相机出错
*/
void onScanQRCodeOpenCameraError()
在云豹直播app源码中,实际代码为:
private ZXingView mZXingView;
mZXingView.startCamera(); // 打开后置摄像头开始预览,但是并未开始识别
// mZXingView.startCamera(Camera.CameraInfo.CAMERA_FACING_FRONT); // 打开前置摄像头开始预览,但是并未开始识别
mZXingView.startSpotAndShowRect(); // 显示扫描框,并开始识别
@Override
public void onScanQRCodeSuccess(final String result) {
//扫描出的结果使个字符串,然后根据需要对字符串进行操作
L.e(TAG, "result:" + result);
if (TextUtils.isEmpty(result)){
ToastUtil.show(WordUtil.getString(R.string.qr_code_9));
return;
}
String prefix = "uid=";
if (result.startsWith(prefix)){
final String toUid = result.substring(prefix.length());
}
// vibrate();
// mZXingView.startSpot(); // 开始识别
}
@Override
protected void onResume() {
super.onResume();
startScan();
}
@Override
public void onCameraAmbientBrightnessChanged(boolean isDark) {
// 这里是通过修改提示文案来展示环境是否过暗的状态,接入方也可以根据 isDark 的值来实现其他交互效果
String tipText = mZXingView.getScanBoxView().getTipText();
String ambientBrightnessTip = "\n环境过暗,请打开闪光灯";
// L.e(TAG,"isDark--->"+isDark);
}
@Override
public void onScanQRCodeOpenCameraError() {
L.e(TAG, "打开相机出错");
}
最后,使用完别忘记销毁:
mZXingView.onDestroy(); // 销毁二维码扫描控件