二维码解析优化方案
二维码解析大致流程
image.png每次相机对焦成功,都会进入:
void onPreviewFrame(byte[] data, Camera camera){
//开启工作线程,解析二维码数据
decodeTask.executeOnExecutor( SINGLE_THREAD_EXECUTOR , data);
};
在这个回调中,data就是图像的二进制数据,然后对其解析。通过实验发现,正常扫码会多次解析失败,然后成功解析。那么,提高扫码速度无非就是3个方面:
-
提高对焦速度
-
优化图像准确度(图像是清晰的,简洁的二维码,杂物少),争取一次解析成功
-
提高解析速度
提高对焦速度
通过测试发现,每次对焦成功才会进入onPreviewFrame从而开始解码,比如自动对焦时间设为5秒,那么至少要5秒钟之后,开可以开始二维码解析。
对焦速度和硬件设备有关,高端手机的对焦速度和准确率肯定更好。我们可以尝试缩短自动对焦时间间隔,比如1s自动对焦一次:
@Override
public void onAutoFocus(boolean success, android.hardware.Camera camera) {
mAutoFocusHandler.postDelayed( new Runnable() {
@Override
public void run() {
//1000ms后再次尝试对焦
mCameraMgr.autoFocus( DecoderView.this );
}
} , 1000 );
}
这个对焦时间也不能设置太短,不排除某些低端设备不支持过快的自动对焦。
第二,针对你们app的使用场景,可以尝试拉近放大取景,争取快速对焦。
优化图像准确度
解析二维码一次成功和2次才成功,时间直接缩短一半,所以这一部分才是提高二维码解析速度的关键!可以从下面2方面入手优化:
- 二维码扫描一般都有一个扫描框,框越大用户使用越方便,但是取景的信息量也更大,加大了解析难度。
框越小,取景信息更精准,但是用户使用不太方便。我查看了 微信,支付宝,摩拜单车三家二维码解析界面,框的大小是屏幕宽度一半。算比较小的相当于指引用户去对准目标二维码,从而提高解码速度,所以可以借鉴这个做法把取景框设置为屏幕宽度一半的正方形。
- 简化二维码信息量
这是提高解析速度最关键的,可以在草料二维码官网做测试,二维码越简单扫码速度提高的很明显。
常见的方案就是把复杂的数据简化为参数,然后通过请求服务器获取完成数据。比如某二维码是商品信息,很长的的一串json数据,可以简化为这个商品的ID做成二维码,用户扫码后请求服务器获取商品完整信息,大大提高了扫码效率。
其实就是把二维码的不稳定性(张贴位置,破损情况,光线等),和用户设备的差异性(低端设备解析效率差)最小化,把解析时间转移到网络请求,实现解析效率最大化。要注意的是,为了以后的扩展,这个二维码的格式要具有通用性,不能一个业务一个二维码格式。
提高解析速度
目前解析二维码都是用的开源库要么ZXING 要么ZBAR,都是成熟的开源库我不认为还有很大的提升空间。本人也未对里面的解析原理有过深究,不再详述。
总结
优先简化二维码格式,字段信息越少越好,格式定义一定要有通用性。其次,尝试缩短对焦时间和调整取景框大小。再配合优秀的解析开源库比如Zbar,解析速度和微信只是毫厘之差。