Android Camera2 фонарик запрос фонарика нарушает вид записи - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь использовать 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();
    }
}
...