Есть два места, где вы можете захотеть сделать эти настройки:
· Если вы хотите сделать это до начала просмотра, то лучше было бы внутри перекрытой метода onConfigured в createCameraPreviewSession() недействительная (строка 696 в файле Camera2BasicFragment предоставляется в компании Google Camera2Basic образца:
private void createCameraPreviewSession() {
try {
SurfaceTexture texture = mTextureView.getSurfaceTexture();
assert texture != null;
// We configure the size of default buffer to be the size of camera preview we want.
texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
// This is the output Surface we need to start preview.
Surface surface = new Surface(texture);
// We set up a CaptureRequest.Builder with the output Surface.
mPreviewRequestBuilder
= mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
mPreviewRequestBuilder.addTarget(surface);
// Here, we create a CameraCaptureSession for camera preview.
mCameraDevice.createCaptureSession(Arrays.asList(surface, mImageReader.getSurface()),
new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {
// The camera is already closed
if (null == mCameraDevice) {
return;
}
// When the session is ready, we start displaying the preview.
mCaptureSession = cameraCaptureSession;
try {
//Place here your custom camera settings
// Start displaying the camera preview.
mPreviewRequest = mPreviewRequestBuilder.build();
mCaptureSession.setRepeatingRequest(mPreviewRequest,
mCaptureCallback, mBackgroundHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onConfigureFailed(
@NonNull CameraCaptureSession cameraCaptureSession) {
showToast("Failed");
}
}, null
);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
· Если вы хотите сделать настройки после просмотра начала и во время выполнения просто позвоните вашим disableAutomatics() из пользовательского интерфейса или где-нибудь еще и он должен работать нормально.
Обратите внимание, что вам не нужно, чтобы закрыть старую CaptureSession вызывая его CaptureSession.close() метод, как описано в ответе на this other question, потому что новый заменяет старую один.
Однако я не уверен, что установка значения времени экспозиции вручную, как вы делали в вашем вопросе
mPreviewRequestBuilder.set (CaptureRequest.SENSOR_EXPOSURE_TIME, 1000000L);
потому что вы можете получить неожиданные результаты. То, что я знаю, что сделать это, как правило, не рекомендуется, и это предпочли вместо того, чтобы позволить камере настроить на свой собственный, а затем вызвать AE (автоэкспозиции) замок:
mPreviewRequestBuilder.set(CaptureRequestCONTROL_AE_LOCK, true);
Вы можете проверить ссылку CONTROL_AE_LOCK here.
Но если вашему коду требуется фиксированное время экспозиции, оно должно работать.