Я пытаюсь использовать Android Camera2 API для реализации возможности фонарика поверх полнофункционального приложения камеры на основе этого урока, который не содержит функцию фонарика: https://github.com/mobapptuts/android_camera2_api_video_app/blob/master/app/src/main/java/mobapptut/com/camera2videoimage/Camera2VideoImageActivity.java.
Мой код фонарика работает и включает и выключает фонарик, как и ожидалось, но экран записи зависает всякий раз, когда я включаю фонарик после съемки.
Вот код, который я использую для включения и выключения фонарика:
public void turnOnFlashLight() {
if (!isFlashlightOn) {
isFlashlightOn = true;
captureRequestBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_TORCH);
try {
recordCaptureSession.setRepeatingRequest(captureRequestBuilder.build(), null, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
}
public void turnOffFlashLight() {
if (isFlashlightOn) {
isFlashlightOn = false;
captureRequestBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF);
try {
recordCaptureSession.setRepeatingRequest(captureRequestBuilder.build(), null, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
}
Выполнение вышеуказанного кода перед тем, как сделать снимок, вполне нормально, но после съемки, обе функции будут запускать ImageReader.OnImageAvailableListener несколько раз без остановки , что, как я полагаю, является причиной зависания экрана записи.Как я могу предотвратить запуск кода моего фонарика слушателем imageReader?
Просто для справки, вот код, который устанавливает captureRequestBuilder и recordCaptureSession.Все они основаны на учебнике и прекрасно работают до того, как я реализовал функции фонарика.
private void startStillCaptureRequest() {
try {
if(isRecording()) {
captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_VIDEO_SNAPSHOT);
} else {
captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
}
captureRequestBuilder.addTarget(imageReader.getSurface());
CameraCaptureSession.CaptureCallback stillCaptureCallback = new CameraCaptureSession.CaptureCallback() {};
if(isRecording()) {
recordCaptureSession.capture(captureRequestBuilder.build(), stillCaptureCallback, null);
} else {
previewCaptureSession.capture(captureRequestBuilder.build(), stillCaptureCallback, null);
}
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
private void startRecord () {
try {
setupMediaRecorder();
SurfaceTexture surfaceTexture = textureView.getSurfaceTexture();
surfaceTexture.setDefaultBufferSize(previewSize.getWidth(), previewSize.getHeight());
Surface previewSurface = new Surface(surfaceTexture);
Surface recordSurface = mediaRecorder.getSurface();
captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
captureRequestBuilder.addTarget(previewSurface);
captureRequestBuilder.addTarget(recordSurface);
cameraDevice.createCaptureSession(Arrays.asList(previewSurface, recordSurface, imageReader.getSurface()),
new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(CameraCaptureSession session) {
recordCaptureSession = session;
try {
recordCaptureSession.setRepeatingRequest(captureRequestBuilder.build(), null, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onConfigureFailed(CameraCaptureSession session) {
Log.d(LOGTAG, "onConfigureFailed: startRecord");
}
}, null);
} catch (IOException | CameraAccessException e) {
e.printStackTrace();
}
}