前言
现在一维码二维码在我们的日常生活中使用如此的广泛,所以拥有扫码功能的APP变得非常普遍,一个安卓APP需要扫码功能就要用到zxing了,zxing是谷歌开源的让开发者更方便使用摄像头的库,而我们常用的扫码功能就是其中之一。但是因为zxing的功能太强大了,包含了很多我们用不上的功能,所以一般都会抽取其中的扫码功能单独使用,这个抽取的过程还是有点麻烦的,但是已经有很多开发者为我们省去了这个过程,然后出现一个很棒的第三方zxing库:zxing-android-embedded。目前阿里旗下的weex技术内部就是采用这个zxing-android-embedded解码库的。通过项目中代码
compile 'com.journeyapps:zxing-android-embedded:3.4.0'
也能看出来weex内嵌了这个扫码库。
通过实际的开发与测试发现,使用这个扫码库,想要扫出我们公司的条码是根本扫不出的(sis app我是进行优化一部分的,最原生的扫码连灯光开启也没有,如果sis不开启灯光肯定扫不出来),那就要进行优化了,谈到优化,必定需要导入
zxing-android-embedded源码
这个是所导入的源码。
接下来的工作就是进行扫码优化,根据前人的经验总结,那么我扫码优化的方向分为以下几点:
1. 通过调整扫描区域来优化
Zxing 是google提供的二维码扫描工程 本身默认的扫图区域最大只有 360*480 ,这样的话我们的手机必须和条形码在一个准确的位置来进行扫描,如果不在一个准确的位置,那么很容易扫不到。
在CameraManager.java这个类中进行调整
默认的大小是 以下这4个参数
// private static final int MIN_FRAME_WIDTH = 240;
// private static final int MIN_FRAME_HEIGHT = 240;
// private static final int MAX_FRAME_WIDTH = 480;
// private static final int MAX_FRAME_HEIGHT = 360;
这样可以根据屏幕大小调整,可以增大这些数值 : 最小的宽 高 ; 最大宽高 。通过源码的分析,这些参数的作用位置在CameraManager类下所起到的作用。这里做成一个动态取图,根据摄像机与条码的距离不同,来动态设配扫描区域。
那么这里的四个参数自然用不上了,在代码中注释即可。
2. 精简解码码制
目前 github 上Zxing 支持的码制有以下的种类,通过源码得到
// Product Codes public static final String UPC_A = "UPC_A"; public static final String UPC_E = "UPC_E"; public static final String EAN_8 = "EAN_8"; public static final String EAN_13 = "EAN_13"; public static final String RSS_14 = "RSS_14"; // Other 1D public static final String CODE_39 = "CODE_39"; public static final String CODE_93 = "CODE_93"; public static final String CODE_128 = "CODE_128"; public static final String ITF = "ITF"; public static final String RSS_EXPANDED = "RSS_EXPANDED"; // 2D public static final String QR_CODE = "QR_CODE"; public static final String DATA_MATRIX = "DATA_MATRIX"; public static final String PDF_417 = "PDF_417";
那么通过咨询曹大哥工位牌项目用的是code_128的编码方式,那么可以精简解码的方式,只用code_128即可。这样可以增加android内部的系统运行速度。提高解码效率
3. 缩短自动聚焦的间隔时间
Zxing 默认的聚焦间隔时间是2000毫秒。扫码是在每一次调用相机聚焦完成后触发回调取图解析的。在这里缩短聚焦时间会提高解析频率,扫码性能自然就提升了。当然也有不好的地方,提高了聚焦的频率,对手机电量的消耗自然增加了。我这里是把聚焦间隔修改成了800毫秒。