Я хочу отключить AF на устройстве, и отчет CameraCharacteristics имеет INFO_SUPPORTED_HARDWARE_LEVEL_3, поэтому я должен иметь возможность это сделать.
Однако, когда я установил для CONTROL_AF_MODE значение OFF, SurfaceHolder просто пустым. Установка чего-то другого, например фильтра сепии, кажется, работает нормально, поэтому я предполагаю, что передаю какое-то недопустимое значение.
Что я могу сделать неправильно? Мой код выглядит следующим образом:
private class CameraStateWatcher extends CameraDevice.StateCallback {
@Override
public void onOpened(@NonNull CameraDevice cameraDevice) {
TestCamera.this.cameraDevice = cameraDevice;
List<Surface> surfaces = new ArrayList<>();
surfaces.add(previewSurface);
surfaces.add(imageReader.getSurface());
try {
CaptureRequest.Builder captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
captureRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF);
captureRequestBuilder.set(CaptureRequest.CONTROL_EFFECT_MODE, CaptureRequest.CONTROL_EFFECT_MODE_SEPIA);
for ( Surface surface : surfaces ) {
captureRequestBuilder.addTarget(surface);
}
captureRequest = captureRequestBuilder.build();
for ( CaptureRequest.Key<?> key : captureRequest.getKeys() ) {
Log.d("STATE_WATCHER", "Request Key = " + key.getName());
}
cameraDevice.createCaptureSession(surfaces, cameraSurfaceWatcher, handler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onDisconnected(@NonNull CameraDevice cameraDevice) {
}
@Override
public void onError(@NonNull CameraDevice cameraDevice, int i) {
}
}
private class SurfaceWatcher implements SurfaceHolder.Callback {
@Override
public void surfaceCreated( SurfaceHolder surfaceHolder ) {
Log.d("SURFACE_CREATOR", "surfacewatcher created");
TestCamera.this.surfaceHolder = surfaceHolder;
previewSurface = surfaceHolder.getSurface();
Rect rect = surfaceHolder.getSurfaceFrame();
imageReader = ImageReader.newInstance( rect.width(), rect.height(), ImageFormat.YUV_420_888, 2);
imageReader.setOnImageAvailableListener(imageReaderFrameWatcher,handler);
openCamera();
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
Log.d("SURFACE_CREATOR", "surfacewatcher changed");
previewSurface = surfaceHolder.getSurface();
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
Log.d("SURFACE_CREATOR", "surfacewatcher destroyed");
TestCamera.this.surfaceHolder = null;
previewSurface = null;
}
}