android使用zxing在单次自动对焦设备上支持连续对焦

版本

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就可以支持单次自动对焦的设备连续自动对焦了。

基本原理就是利用单次自动对焦设备每次启动都会执行自动对焦的特点,重复启动关闭自动对焦功能,以达到连续自动对焦的目的。

以上内容为原创,纯属记录,如果有大神看到有更加好的解决办法,可以留言交流一下。


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值