ZXing自动对焦问题

Dud*_*ude 3 android zxing autofocus android-camera

我为硕士论文编写了一个适用于Android 3.1的Motorola Xoom平板电脑的应用程序,该应用程序可以使用其相机实时扫描多个QR码,并通过识别的QR码在显示屏上显示其他信息。

识别是通过ZXing安卓应用(http://code.google.com/p/zxing/)完成的,我基本上只是更改了ZXing应用的代码,以便它可以同时识别多个QR码,并且可以连续进行此扫描,而不会像原始应用一样成功扫描后冻结。因此,我的应用程序基本上是ZXing应用程序,可以连续扫描多个QR码。

但是我面临一个问题:

  1. ZXing应用程序进行某种连续的自动对焦。它会启动自动对焦,完成后会再次自动启动自动对焦。但是这种方法会以某种方式使相机的亮度设置太亮,从而使相机无法识别QR码,因为图像几乎是全白的。禁用自动对焦可以解决该问题,但是我需要自动对焦,因为否则只能在一定距离下才能识别QR码。

    • 如何更改相机的亮度设置?
    • 有人知道自动对焦的另一种可能性吗?

Pav*_*kov 5

我在Samsung Galaxy Grand 2(Android 4)上遇到了同样的问题,并且找到了一个解决方案。启动相机之前,我禁用了自动对焦功能。1-2秒后,我启用了它。我尝试了几种方法,并决定定期切换自动对焦功能。为了实现这一点,我创建了util类-FocusHandler。

public class FocusHandler implements Runnable{

    private final int FOCUS_OFF_TIME = 2000;
    private final int FOCUS_ON_TIME = 20000;
    private boolean flag = false;
    private boolean state = false;
    private Handler handler;
    private WeakReference<ZXingScannerView> scannerView;

    public FocusHandler(Handler handler, ZXingScannerView scannerView){
        this.handler = handler;
        this.flag = false;
        this.scannerView = new WeakReference<>(scannerView);
    }

    public void start(){
        state = true;
        this.handler.post(this);
    }

    public void stop(){
        state = false;
        scannerView.clear();
    }

    @Override
    public void run() {
        if (!state || this.scannerView.get() == null){
            return;
        }

        int time;
        if (!flag){
            this.scannerView.get().setAutoFocus(flag);
            time = FOCUS_OFF_TIME;
        }
        else{
            this.scannerView.get().setAutoFocus(flag);
            time = FOCUS_ON_TIME;
        }

        flag = !flag;
        handler.postDelayed(this, time);
    }
}
Run Code Online (Sandbox Code Playgroud)

/ ***************活动****************** /

    private ZXingScannerView scannerView;
    private FocusHandler focusHandler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scanner);
        scannerView = new ZXingScannerView(this);
        focusHandler = new FocusHandler(new Handler(), scannerView);
        frameLayout.addView(scannerView);
    }

    @Override
    protected void onResume() {
        super.onResume();
        scannerView.setResultHandler(this);
        scannerView.setAutoFocus(false);
        scannerView.startCamera();
        focusHandler.start();
    }

    @Override
    public void onPause() {
        super.onPause();
        scannerView.stopCamera();
        focusHandler.stop();
    }
Run Code Online (Sandbox Code Playgroud)