Android知识Android技术知识Android开发

二维码解析优化方案

2018-01-19  本文已影响0人  08_carmelo

二维码解析大致流程

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,解析速度和微信只是毫厘之差。

上一篇 下一篇

猜你喜欢

热点阅读