4

我为我的硕士论文编写了一个带有 Android 3.1 的摩托罗拉 Xoom 平板电脑应用程序,该应用程序可以使用它的相机实时扫描多个 QR 码,并在显示屏上通过识别的 QR 码显示附加信息。

识别是用ZXing android app ( http://code.google.com/p/zxing/ ) 完成的,我基本上只是把ZXing app 的代码改了,让它可以同时识别多个二维码,并且可以持续执行此扫描,而不会像原始应用程序那样在成功扫描后冻结。所以我的应用程序基本上是ZXing应用程序,可以连续扫描多个二维码。

但我面临一个问题:

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

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

4 回答 4

5

我在三星 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);
    }
}

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

    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();
    }
于 2016-09-21T14:30:55.863 回答
3

我已经在邮件列表中回答了这个问题。

该应用程序无法更改相机预览的“质量”:您是指分辨率吗?分辨率不是限制因素。也许您的应用选择了特别低的分辨率;在某些时候它没有帮助。但是扫描 800x600 对于二维码应该绰绰有余了。

自动对焦与亮度无关。相机驱动程序本身总是自动调整曝光。该应用程序无法控制这一点,也不能;您可以做的最好的事情是在更高版本的 Android API 中修改曝光设置。

于 2012-01-03T16:25:59.490 回答
0

似乎在某些设备上(对我来说,它也发生在 Android 3.0 设备上:三星 Galaxy Tab 10.1),在成功调用自动对焦后,自动曝光保持锁定状态。对不同的亮度区域进行另一次对焦,自动曝光将再次启用,但在对焦完成后保持锁定。尚不确定如何解决此问题。

于 2012-05-16T12:41:58.703 回答
0

启用 isContinuousFocusEnabled。

barcodeScannerView.barcodeView.cameraSettings.isContinuousFocusEnabled = true
于 2020-10-08T10:19:17.097 回答