赞
踩
接触到一个需求扫一维码的时候很难扫到,后来测试发现,是自动对焦问题。
zxing的自动对焦线程始终都在执行,但是硬件无法支持连续自动对焦,而只在扫描界面启动后进行一次对焦,而我们在扫码的时候不可能保证在同一距离下扫码。
解决方案:
1在 AutoFocusManager类中加入
//在这里插入代码片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) { start(); } return null; } }
2在 onAutoFocus方法中加上
@Override
public synchronized void onAutoFocus(boolean success, Camera theCamera) {
if (success) {
//自动对焦
outstandingTask = new AutoFocusTask();
outstandingTask.executeOnExecutor(Executors.newCachedThreadPool());
autoStopTask = new AutoStopTask();
autoStopTask.executeOnExecutor(Executors.newCachedThreadPool());
}
}
3在stop方法添加以下代码 线程也需要每次都停止
if(autoStopTask != null){
autoStopTask.cancel(true);
autoStopTask = null;
}
总结:原理就是利用单次自动对焦设备每次启动都会执行自动对焦的特点,重复启动关闭自动对焦功能,以达到连续自动对焦的目的。
完整类
/*
* Copyright (C) 2012 ZXing authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。