4

我在使用 Camera2 API 实现触摸对焦时遇到问题。这是我的代码:

    mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_CANCEL);
    if (isMeteringAreaAESupported()) {
        mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_REGIONS,
                new MeteringRectangle[]{focusArea});
    }
    if (isMeteringAreaAFSupported()) {
        mPreviewRequestBuilder
                .set(CaptureRequest.CONTROL_AF_REGIONS, new MeteringRectangle[]{focusArea});
        mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
                CaptureRequest.CONTROL_AF_MODE_AUTO);
    }
    mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,
            CameraMetadata.CONTROL_AF_TRIGGER_START);
    try {
        mCaptureSession.setRepeatingRequest(mPreviewRequestBuilder.build(), null,
                mBackgroundHandler);
        mManualFocusEngaged = true;
    } catch (CameraAccessException e) {
      // error handling
    }

我看到的问题是,当在短时间内多次调用上述代码(即用户在设置焦点之前太快地触摸屏幕)时,某些设备上的闪光灯会出现奇怪的行为。例如,在 S5 上,看起来所有的请求都在排队,如果用户触摸了很多次,它们会一个一个地执行一段时间。在我的 Nexus 5 上,闪光灯不会在请求之间闪烁,而是会一直亮着,直到最后一个请求完成执行。

我所追求的是真正取消飞行中的请求,就像他们在谷歌相机中所做的那样。如果您使用 Google 相机在闪光灯开启的情况下尝试相同的操作,他们会在注册新触摸时立即取消请求。

我已经尝试mCaptureSession.abortCaptures();在上述方法之前添加,但它的工作方式不同,并且也开始丢帧。mCaptureSession.stopRepeating();根本没有任何区别。

4

1 回答 1

3

显然我必须执行捕获请求才能取消 AF。

我在 CANCEL 触发器的第一行之后添加了这个:

        try {
            mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback,
                mBackgroundHandler);
            // After this, the camera will go back to the normal state of preview.
            mState = STATE_PREVIEW;
        } catch (CameraAccessException e){
            // log
        }
于 2016-01-11T14:04:17.337 回答