Android Camera2触摸对焦实施-取消新触摸

Android Camera2触摸对焦实施-取消新触摸,android,camera2,android-camera2,Android,Camera2,Android Camera2,我在使用Camera2 API实现触摸对焦时遇到问题。这是我的密码: mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_CANCEL); if (isMeteringAreaAESupported()) { mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_REGION

我在使用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上,看起来所有请求都已排队,如果用户多次触摸,它们会一个接一个地执行一段时间。在我的Nexus5上,闪存不会在不同的请求之间闪烁,但会一直打开,直到最后一个请求完成执行

我想要的是像谷歌相机那样取消飞行中的请求。如果你使用谷歌相机在flash上尝试同样的事情,他们会在注册新触摸时立即取消请求


我已尝试添加
mCaptureSession.abortCaptures()
在使用上述方法之前,但它的工作方式不同,因此也开始删除帧<代码>mCaptureSession.stopRepeating()没有任何区别。

显然,我必须执行捕获请求以取消AF

我在第一行后添加了以下内容:

        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
        }

你能用camera2分享触摸对焦的代码吗?太棒了!这就是我想要的事实上,您应该使用capture()而不是repeatingRequest()执行所有触发器start和cancel(在AF和precapture触发器中),以便只发送一次请求,否则状态机将陷入循环,试图在某些设备中聚焦。然后,调用repeatingRequest(),并将触发器设置为IDLE