Android二维码多码识别,相册选择二维码,自定义扫码界面
2021-08-31 本文已影响0人
Sarah_Y
现在很多App都有扫码识别二维码的场景,最新的扫码已经支持全屏扫码、从相册选取二维码识别,以下使用基于Zxing封装的一个库:https://github.com/maning0303/MNZXingCode
MNZXingCode 快速集成zxing二维码扫描
快速集成zxing二维码扫描,生成二维码,可配置相册,闪光灯,相机可以调整焦距放大缩小,自定义扫描线颜色,自定义背景颜色,自定义遮罩层,自定义Activity,多个二维码扫码(zxing:core:3.3.3/3.4.0)
1:生成二维码,支持修改颜色和边距,支持带Logo
2:二维码扫描,手势缩放,无拉伸,样式自定义
3:相册中选取图片识别
4:闪光灯开关
5: 相机可以调整焦距放大缩小
6: 完全自定义遮罩层
7: 自定义Activity
8: 支持微信,支付宝类似多个二维码扫码
gradle集成方式:
//扫一扫支持全屏、从相册选择:需要支持7.0以下
implementation 'com.google.zxing:core:3.3.3'
implementation 'com.github.maning0303:MNZXingCode:V2.1.8'
具体使用:
//(1)默认扫描使用:
MNScanManager.startScan(this, new MNScanCallback() {
@Override
public void onActivityResult(int resultCode, Intent data) {
switch (resultCode) {
case MNScanManager.RESULT_SUCCESS:
String resultSuccess = data.getStringExtra(MNScanManager.INTENT_KEY_RESULT_SUCCESS);
break;
case MNScanManager.RESULT_FAIL:
String resultError = data.getStringExtra(MNScanManager.INTENT_KEY_RESULT_ERROR);
break;
case MNScanManager.RESULT_CANCLE:
showToast("取消扫码");
break;
}
}
});
// (2)自定义扫描布局和参数
MNScanConfig scanConfig = new MNScanConfig.Builder()
//设置完成震动
.isShowVibrate(true)
//扫描完成声音
.isShowBeep(true)
//显示相册功能
.isShowPhotoAlbum(true)
//显示闪光灯
.isShowLightController(false)
//打开扫描页面的动画
.setActivityOpenAnime(R.anim.activate_in)
//退出扫描页面动画
.setActivityExitAnime(R.anim.activate_out)
//自定义文案--不展示
.setScanHintText("")
//自定义文案颜色
.setScanHintTextColor("#FFFFFF")
//自定义文案大小(单位sp)
.setScanHintTextSize(15)
//是否显示缩放控制器
.isShowZoomController(false)
//显示缩放控制器位置
.setZoomControllerLocation(MNScanConfig.ZoomControllerLocation.Bottom)
//背景颜色
.setBgColor("#33FF0000")
//扫描线样式
.setLaserStyle(MNScanConfig.LaserStyle.Line)
//扫描线的颜色
.setScanColor("#E61F55")
//网格扫描线的列数
.setGridScanLineColumn(30)
//网格高度
.setGridScanLineHeight(1)
//高度偏移值(单位px)+向上偏移,-向下偏移
.setScanFrameHeightOffsets(150)
//是否全屏范围扫描
.setFullScreenScan(true)
//二维码标记点
.isShowResultPoint(true)
// 设置标记点的大小、色值
.setResultPointConfigs(36, 20, 2, "#FFFFFFFF", "#E61F55")
//状态栏设置:颜色,是否黑色字体
.setStatusBarConfigs("#00000000", true)
//是否支持多二维码同时扫出,默认false,多二维码状态不支持条形码
.setSupportMultiQRCode(true)
//自定义遮罩
.setCustomShadeViewLayoutID(R.layout.layout_custom_view, new MNCustomViewBindCallback() {
@Override
public void onBindView(View customView) {
//TODO:通过findviewById 获取View
// 返回按钮,点击关闭扫描
ImageView ivBack = customView.findViewById(R.id.ivBack);
//TODO 打开相册,选择二维码
ImageView ivPhoto = customView.findViewById(R.id.ivPhoto);
tvTips = customView.findViewById(R.id.tvTips);
scanLine = customView.findViewById(R.id.scanLine);
ivBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//关闭扫描页面
MNScanManager.closeScanPage();
}
});
ivPhoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//打开相册扫描
RxPermissions.getInstance(activity).request(
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.CAMERA)
.subscribe(new Observer<Boolean>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Boolean aBoolean) {
if (aBoolean) {
MNScanManager.openAlbumPage();
} else {
Toast.makeText(activity, R.string.permission_request_denied, Toast.LENGTH_LONG)
.show();
}
}
});
}
});
startScanAnimation();
}
})
.builder();
// 开启扫描
MNScanManager.startScan(activity, scanConfig, new MNScanCallback() {
public void onActivityResult(int resultCode, Intent data) {
switch (resultCode) {
case MNScanManager.RESULT_SUCCESS:
String resultSuccess = data.getStringExtra(MNScanManager.INTENT_KEY_RESULT_SUCCESS);
if (callback != null) {
callback.onResult(resultSuccess);
} else {
handleDecode(activity, from, resultSuccess, barcode);
}
break;
case MNScanManager.RESULT_FAIL:
// 错误提示:比如:初始化相机失败等
String resultError = data.getStringExtra(MNScanManager.INTENT_KEY_RESULT_ERROR);
break;
case MNScanManager.RESULT_CANCLE:
ZZSSLog.e("取消扫码");
break;
}
}
});
Activity中调用以上方法:
// (1)授权相机、读写权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
activity.requestPermissions(
new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE},
REQUEST_CODE_OF_SCAN_PAGE);
}
// (2)在onRequestPermissionsResult,获取授权请求结果后,启动扫码
/**
* Callback received when a permissions request has been completed.
*/
@Override
public void onRequestPermissionsResult(final int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CODE_OF_SCAN_PAGE) {
// 将最上面的扫描代码写在startScan()方法中,进行调用,也可以将扫描结果回调出来,随时使用。
startScan(this);
}
}