在项目尤其是电商项目,可能会频繁用到扫一扫的功能,这里我们使用google自带的控件,首先我们需要的是集成他的jar,这里的版本根据官网更新的录入即可
//noinspection GradleDependency 扫描二维码条形码
implementation 'com.google.zxing:core:3.2.1'
implementation 'cn.bingoogolapple:bga-qrcodecore:1.1.7@aar'
implementation 'cn.bingoogolapple:bga-zxing:1.1.7@aar'
然后我们在布局中进行调用
<cn.bingoogolapple.qrcode.zxing.ZXingView
android:id="@+id/zxing_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:qrcv_animTime="1000"
app:qrcv_borderColor="@android:color/white"
app:qrcv_borderSize="1px"
app:qrcv_cornerColor="@color/colorWhite"
app:qrcv_cornerLength="20dp"
app:qrcv_cornerSize="5dp"
app:qrcv_isShowDefaultScanLineDrawable="true"
app:qrcv_isShowTipTextAsSingleLine="true"
app:qrcv_isTipTextBelowRect="true"
app:qrcv_maskColor="#ff353336"
app:qrcv_rectWidth="200dp"
app:qrcv_scanLineColor="@color/colorWhite"
app:qrcv_scanLineSize="2dp"
app:qrcv_tipTextColor="@android:color/white"
app:qrcv_tipTextMargin="15dp"
app:qrcv_tipTextSize="18dp" />
这里附上zxing的相关参数属性,可以根据其中去自定义我们的扫描器
最后我们在activity中进行调用就可以了,别忘了添加相机权限哦,如果需要的话还可以加上震动的权限
//扫条形码
binding.zxingView.changeToScanBarcodeStyle();
binding.zxingView.startSpot();
binding.zxingView.setDelegate(new QRCodeView.Delegate() {
@Override
public void onScanQRCodeSuccess(String result) {
getGoodsInfo(result);
//扫描得到结果震动一下表示
vibrate();
//获取结果后三秒后,重新开始扫描
new Handler().postDelayed(() ->
binding.zxingView.startSpot(), 3000);
}
@Override
public void onScanQRCodeOpenCameraError() {
ToastUtils.showToast(mContext, "打开相机错误,请返回重试~");
}
});
/**
* 这里需要加上打开关闭的功能,防止泄露
*/
@Override
protected void onStop() {
binding.zxingView.stopCamera();
super.onStop();
}
@Override
protected void onDestroy() {
binding.zxingView.stopCamera();
super.onDestroy();
}
//震动
private void vibrate() {
Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
vibrator.vibrate(200);
}
<!-- 相机权限 -->
<uses-permission android:name="android.permission.CAMERA" />
<!--震动权限-->
<uses-permission android:name="android.permission.VIBRATE" />
当然现在提倡的动态申请权限,我们可以集成一个权限的jar包,对于权限进行说明,有兴趣的同学可以去官网详细了解一下,这里附上链接
//权限管理
api 'com.github.getActivity:XXPermissions:12.2'
XXPermissions.with(this)
.permission(Permission.CAMERA)
.request(new OnPermissionCallback() {
@Override
public void onGranted(List<String> permissions, boolean all) {
if (all) {
go(ScanGoodsUI.class);
} else {
ToastUtils.showToast(mContext, "没有相机权限无法扫一扫哦~");
}
}
@Override
public void onDenied(List<String> permissions, boolean never) {
if (never) {
ToastUtils.showToast(mContext, "被永久拒绝授权,请手动授予相机权限");
XXPermissions.startPermissionActivity(MainActivity.this, permissions);
} else {
ToastUtils.showToast(mContext, "获取相机权限失败");
}
}
});
zxing其实是比较灵活的,它会支持条形码和二维码的双重扫描,只需要设置一个参数就可以了哦~
//扫条形码
binding.zxingView.changeToScanBarcodeStyle();
//扫二维码
binding.zxingView.changeToScanQRCodeStyle();