6

我们正在为 Vuzix M100 开发一个应用程序,它应该连续读取条形码并在 textView 中显示结果。因此,相机每 5 秒拍摄一张照片,并将位图发送给 zxing 条码扫描器。我们几乎完成了,但相机只聚焦在第一张照片上。有什么建议么?这是我们代码的重要部分:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv = (TextView) findViewById(R.id.textView1);

        mPreview = (SurfaceView) findViewById(R.id.sv1);
        mPreview.getHolder().addCallback(this);

        mCamera = Camera.open();
        final Parameters param = mCamera.getParameters();

        param.setJpegQuality(100);
        param.setPictureSize(1600, 1200);
        param.setFocusMode(param.FOCUS_MODE_CONTINUOUS_PICTURE);
        param.setSceneMode(Parameters.SCENE_MODE_BARCODE);

        mCamera.setParameters(param);

        final Handler h = new Handler();
        final int delay = 5000; 

        h.postDelayed(new Runnable(){
            int count = 1;
            public void run(){
                tryAutoFocus();
                param.setFocusMode(param.FOCUS_MODE_FIXED);
                param.setFocusMode(param.FOCUS_MODE_AUTO);

                h.postDelayed(this, delay);
            }
        }, delay);

    }

.

private void tryAutoFocus() {

        final PictureCallback myPictureCallback = new PictureCallback() {

            @Override
            public void onPictureTaken(byte[] data, Camera camera) {

                try {
                    Options options = new BitmapFactory.Options();
                    options.inScaled = false;
                    Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length, options);
                    createExternalStoragePublicPicture(bmp);

                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
        };

        AutoFocusCallback myAutoFocusCallback = new AutoFocusCallback() {

            @Override
            public void onAutoFocus(boolean success, Camera arg1) {
                // TODO: Problem: Fokussiert nur beim ersten Foto           

                mCamera.takePicture(null, null, null, myPictureCallback);

                mCamera.cancelAutoFocus();
                mCamera.startPreview();
            }
        };

        mCamera.autoFocus(myAutoFocusCallback);

    }
4

1 回答 1

0

这是一个老问题,但仍然:

请注意,通过设置场景Camera.Parameters.setSceneMode()实际上可能会覆盖任何先前的设置。引用API 文档

更改场景模式可能会覆盖其他参数(如闪光模式、对焦模式、白平衡)。例如,假设最初的闪光模式是打开的,而支持的闪光模式是开/关的。在夜景模式下,闪光模式和支持的闪光模式都可能被更改为关闭。设置场景模式后,应用程序应调用 getParameters 以了解是否更改了某些参数。

此外,文档暗示不仅可以覆盖当前设置,还可以覆盖支持的参数值。

所以我建议:

  • 先设置场景模式设置对焦模式
  • 设置场景模式后,检查是否仍支持所需的对焦模式getSupportedFocusModes()
于 2021-12-16T12:01:05.823 回答