Android Camera2, отключить автофокус
Мое приложение использует Camera2 API для максимально быстрой съемки кадров. У нас есть кнопка Пуск / Стоп, чтобы начать / остановить захват кадров. Фокусировка либо установлена на автоматический режим, либо выполняется до захвата. Если фокус сделан перед захватом, то во время захвата он должен быть отключен.
Я использую это, чтобы сделать фокус:
public void focusAt(Point point) {
if(mCanAe || mCanAf) {
int areaSize = 200;
int ll = ((point.x * mActiveArraySize.right) - areaSize) / mTextureView.getWidth();
int rr = ((point.y * mActiveArraySize.bottom) - areaSize) / mTextureView.getHeight();
int focusLeft = clamp(ll, 0, mActiveArraySize.right);
int focusBottom = clamp(rr, 0, mActiveArraySize.bottom);
Rect newRect = new Rect(focusLeft, focusBottom, focusLeft + areaSize, focusBottom + areaSize);
MeteringRectangle meteringRectangle = new MeteringRectangle(newRect, 1);
final MeteringRectangle[] meteringRectangleArr = { meteringRectangle };
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_CANCEL);
try {
mCaptureSession.capture(mPreviewRequestBuilder.build(), new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
if (mCanAe) {
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_REGIONS, meteringRectangleArr );
}
if (mCanAf) {
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_REGIONS, meteringRectangleArr );
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);
}
catch (CameraAccessException e) {
e.printStackTrace();
}
}
}, mBackgroundHandler);
}
catch (CameraAccessException e) { e.printStackTrace(); }
}
}
Эта функция не может быть вызвана во время захвата. Я думал, что этого будет достаточно, но иногда во время захвата Camera2 пытается сфокусироваться.
Есть ли способ отключить фокус?
Другой вопрос, обязательно ли блокировать фокус перед захватом? Кажется, работает нормально, не делая этого, но я хотел бы быть уверен.
РЕДАКТИРОВАТЬ: чтобы захватить, я делаю это:
private void capture() {
try {
final CaptureRequest.Builder captureBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG);
captureBuilder.addTarget(mImageReader.getSurface());
// Orientation
int rotation = getActivity().getWindowManager().getDefaultDisplay().getRotation();
captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, getOrientation(rotation));
mCaptureSession.capture(captureBuilder.build(), null, mTakeImageBackgroundHandler);
}
catch (CameraAccessException e) {
e.printStackTrace();
}
Я вызываю метод capture(), как только кадр сохраняется.