Только что начал использовать рамку Camera2 из-за повышенного контроля над низкоуровневыми функциями камеры. Тем не менее, у меня возникают проблемы с быстром включением и выключением фонарика. Со старым API камеры, я мог бы переключить вспышку во время подачи предварительного просмотра по:Переключить фонарик в Camera2 без прерывания предварительного просмотра
try
{
android.hardware.Camera.Parameters parameters = c.getParameters();
if (parameters.getFlashMode().equals(Camera.Parameters.FLASH_MODE_OFF))
{
parameters.setFlashMode(Parameters.FLASH_MODE_TORCH);
Log.i("HeartBeatAlgorithm", "LightOn");
}
else if (parameters.getFlashMode().equals(Camera.Parameters.FLASH_MODE_TORCH))
{
parameters.setFlashMode(Parameters.FLASH_MODE_OFF);
Log.i("HeartBeatAlgorithm", "LightOff");
}
c.setParameters(parameters);
}
catch (Exception exception)
{
c.release();
c = null;
}
И фонарик быстро включить или выключить, без какого-либо заметного прерывания. С Camera2, однако, кажется, что режим вспышки является собственностью CaptureSession, что означает совершенно новый CaptureSession должен быть создан, чтобы изменить режим вспышки, то есть:
try
{
SurfaceTexture texture = mTextureView.getSurfaceTexture();
assert texture != null;
texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
Surface surface = new Surface(texture);
mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
if (mLightNowOn == true)
{
mPreviewRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_TORCH);
}
else
{
mPreviewRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
}
mPreviewRequestBuilder.addTarget(surface);
mPreviewRequest = mPreviewRequestBuilder.build();
mCameraDevice.createCaptureSession(Arrays.asList(surface), mSessionStateCallback, null);
}
catch (CameraAccessException e)
{
e.printStackTrace();
}
Как упоминается в документации для разработчиков, " Создание сеанса является дорогостоящей операцией и может занимать несколько сотен миллисекунд, поскольку для этого требуется настройка внутренних конвейеров устройства камеры и выделение буферов памяти для отправки изображений в желаемые цели ». Это определенно делает, и есть заметная задержка в моем приложении при переключении режима вспышки.
Мне действительно нужно иметь возможность быстро переключать режимы вспышки, не прерывая предварительный просмотр. Есть ли способ обойти это, или это неизбежно из-за нового конвейера API?