一、概述
相信Adnroid开发都知道,有四款扫描器,Zxing 、Zbar ,Barcode4J、OkapiBarcode 前二者应用较广泛,至于介绍与区别就在此阐述,网上有很多。此文主要介绍在在使用过程中,官方客户端各种达不到需求。相信很多童鞋都有此体会,所以借此机会就在Zxing 官方客户端基础上修改,去除无用功能并二次封装达到可扩展。
- 官方客户端目前问题汇总
- 设置功能多余
- 竖屏后不能正向扫描条形码
- 扫描框大小、颜色、扫描线配置不够灵活
- 无生成二维码、主动识别二维码功能
- 介于以上问题,于是该库就华丽的诞生
- 修复竖屏不能正向扫描条形码
- 可定制扫描框与扫描线样式
- 加入创建二维码、识别图片中的二维码功能
二、效果图
下载APK体验或手机扫描下面二维码
三、四、引用
zxing:core:3.3.0
1、在线 已集成- 本库依赖使用Gradle构建时添加一下即可
compile 'com.mylhyl:zxingscanner:1.6.0'
2、离线jar,需要手动添加 Zxing 核心库
- jar包
- 也可自己打包jar文件打开终端,切换置项目根据目录,执行命令:gradlew makeJar
- 最新Zxing核心库点击查看取出aar
- 也可使用Gradle构建时如下:
compile 'com.google.zxing:core:3.3.0'
gradle makeJar 或者参考下图,在android studio中执行
五、使用
直接在layout xml
使用ScannerView
即可
<com.mylhyl.zxing.scanner.ScannerView
android:id="@+id/scanner_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
注意生命周期中的使用
重写onResume
调用mScannerView.onResume();
@Override
protected void onResume() {
mScannerView.onResume();
super.onResume();
}
@Override
protected void onPause() {
mScannerView.onPause();
super.onPause();
}
注册扫描成功监听器setOnScannerCompletionListener
/**
* 扫描成功后将调用
*
* @param rawResult 扫描结果
* @param parsedResult 结果类型
* @param barcode 扫描后的图像
*/
void OnScannerCompletion(Result rawResult, ParsedResult parsedResult, Bitmap barcode);
调用如下方法获取类型
ParsedResultType type = parsedResult.getType();
可根据type
强转为相应的对象,按项目需求处理。每个项目都有不同的需求,所以此库将最终处理结果丢给你们自己咯,想怎么玩就怎么玩,下面代码是在 sample 中
switch (type) {
case ADDRESSBOOK:
AddressBookParsedResult addressBook = (AddressBookParsedResult) parsedResult;
bundle.putSerializable(Intents.Scan.RESULT, new AddressBookResult(addressBook));
break;
case URI:
URIParsedResult uriParsedResult = (URIParsedResult) parsedResult;
bundle.putString(Intents.Scan.RESULT, uriParsedResult.getURI());
break;
case TEXT:
bundle.putString(Intents.Scan.RESULT, rawResult.getText());
break;
}
生成二维码使用
//联系人类型
Bitmap bitmap = new QREncode.Builder(this)
.setParsedResultType(ParsedResultType.ADDRESSBOOK)
.setAddressBookUri(contactUri).build().encodeAsBitmap();
//文本类型
Bitmap bitmap = new QREncode.Builder(this)
.setColor(getResources().getColor(R.color.colorPrimary))//二维码颜色
//.setParsedResultType(ParsedResultType.TEXT)//默认是TEXT类型
.setContents("我是石头")//二维码内容
.setLogoBitmap(logoBitmap)//二维码中间logo
.build().encodeAsBitmap();
解析图中二维码
public static void decodeQR(String picturePath, OnScannerCompletionListener listener);
public static void decodeQR(Bitmap srcBitmap, final OnScannerCompletionListener listener)
六、样式设置
方法名 | 说明 | 默认值 |
toggleLight | 切换闪光灯 | 关false |
setMediaResId | 设置扫描完成播放声音 | 无 |
setLaserFrameBoundColor | 扫描框4角颜色 | 绿色0xff00ff00 |
setLaserFrameCornerLength | 扫描框4角长度 | 15dp |
setLaserFrameCornerWidth | 扫描框4角宽度 | 2dp |
setLaserColor | 扫描线颜色 | 绿色0xff00ff00 |
setLaserLineResId | 条形扫描线图片资源 | 无 |
setLaserGridLineResId | 网格扫描线资源 | 无 |
setLaserLineHeight | 扫描线高度 | 2dp |
setLaserFrameSize | 设置扫描框大小 | 屏幕5/8比例 |
setLaserFrameTopMargin | 设置扫描框与屏幕距离 | 屏幕5/8-状态 |
setDrawText | text -> 内容 textSize -> 文字大小 textColor -> 文字颜色 isBottom -> 是否在扫描框下方 textMargin -> 离扫描框间距 |
text -> 将二维码放入框内,即可自动扫描 textSize -> 16sp textColor -> 白色 isBottom -> true textMargin -> 20dp |
setScanMode | 设置扫描类型:二维码、一维码 | 全部 |
isShowResThumbnail | 是否显示扫描结果缩略图 | false |
setLaserMoveSpeed | 设置扫描框线移动间距 | 6px |
setCameraFacing | 设置扫描摄像头 | 后置 |
isScanFullScreen | 是否全屏扫描 | false |
isHideLaserFrame | 是否隐藏扫描框 | false |
七、注意事项
权限
<uses-permission android:name="android.permission.CAMERA" />
对于setLaserFrameTopMargin
方法,扫描区域偏移的问题issues-13
可以在扫描成功后,调用restartPreviewAfterDelay
连续扫描
对于加密后的二维码,判断二维码类型可以如下:
//重新包装`Result`,`decryptText`为解密后的内容
Result decryptResult = new Result(decryptText, rawResult.getRawBytes(),
rawResult.getNumBits(), rawResult.getResultPoints(),
rawResult.getBarcodeFormat(), rawResult.getTimestamp());
//转换扫描结果为类型枚举
ParsedResult decryptParsedResult = Scanner.parseResult(decryptResult);
final ParsedResultType decryptType = decryptParsedResult.getType();
switch (decryptType) {
//类型分支
case :
break;
}
QQ交流群:630413339 点击链接加入群Android-Zxing