版本
zxing-2.3.0
测试onda平板 系统4.3
之前接触到一个需求,在一个平板设备上开发一个超市使用的pad端,扫码功能开发支持扫描商品条形码跳转到商品详情页面
问题:
扫描二维码没有问题,但是扫描条码很难扫描到,后来测试发现,是自动对焦问题,平板的支持的是AFC自动对焦,也就是单次自动对焦,而扫描二维码需要连续自动对焦 才能有效识别条形码。zxing的自动对焦线程始终都在执行,但是硬件无法支持连续自动对焦,而只在扫描界面启动后进行一次对焦,而我们在扫码的时候不可能保证在同一距离下扫码。
解决方案:
1、打开zxing源码中的camera包下的AutoFocusManager.java
2、在文件中插入如下代码:
AutoStopTask autoStopTask;
public class AutoStopTask extends AsyncTask<Object, Object, Object>{
@Override
protected Object doInBackground(Object... params) {
try {
Thread.sleep(AUTO_FOCUS_INTERVAL_MS);
} catch (InterruptedException e) {
// continue
}
synchronized (AutoFocusManager.this) {
stop();
}
return null;
}
}
3、找到onAutoFocus函数覆盖原函数内容为:
if (active) {
outstandingTask = new AutoFocusTask();
// outstandingTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
outstandingTask.executeOnExecutor(Executors.newCachedThreadPool());
autoStopTask = new AutoStopTask();
// autoStopTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
autoStopTask.executeOnExecutor(Executors.newCachedThreadPool());
}
看注释掉部分:executeOnExecutor这个函数是API11后提供的新函数,内部传入参数
AsyncTask.THREAD_POOL_EXECUTOR是设定线程可以并发,但是不能超过5个,这样会对我们新修改的代码造成线程阻塞,对焦几次后边不会再自动对焦了,所以要做修改,不限制线程的并发(目前测试没有问题,不知道会不会因为线程回收不即使导致程序崩溃)。
4、找到stop函数增加如下代码:
if(autoStopTask != null){
autoStopTask.cancel(true);
autoStopTask = null;
}
我们的线程也需要每次都停止。
到这里zxing就可以支持单次自动对焦的设备连续自动对焦了。
基本原理就是利用单次自动对焦设备每次启动都会执行自动对焦的特点,重复启动关闭自动对焦功能,以达到连续自动对焦的目的。
以上内容为原创,纯属记录,如果有大神看到有更加好的解决办法,可以留言交流一下。