我在使用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相机中一样。如果您使用Google相机尝试使用闪光灯打开相同的内容,则会在注册新触摸时立即取消请求。
我尝试在上述方法之前添加mCaptureSession.abortCaptures();
,但它没有以相同的方式工作并开始丢帧。 mCaptureSession.stopRepeating();
根本没有任何区别。
答案 0 :(得分: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
}