Перепривязка CameraX UseCases - PullRequest
       60

Перепривязка CameraX UseCases

1 голос
/ 23 февраля 2020

Я пытаюсь остановить / приостановить работу камеры PreviewView во время обработки / обнаружения изображения с использованием Firebase MLKit. Чтобы приостановить предварительный просмотр, я вызываю

cameraProvider.unbind(previewUseCase)

, который останавливает предварительный просмотр последнего кадра, но теперь я не знаю, как его перезапустить. Я попытался просто привязать предварительный просмотр еще раз, как это

cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, preview)

Но это заставляет PreviewView просто показывать белый цвет, как будто его уже нет, и не могу вернуть его обратно, пока не перезапустить приложение.

То же самое что-то происходит, когда я звоню unbindAll()

Поэтому мой вопрос заключается в том, как приостановить предварительный просмотр, а затем перезапустить его позже?

это мой код

fun setupCamera(windowManager: WindowManager, previewView: PreviewView){

    _cameraProvider = _cameraProviderFuture.get()

    _preview = Preview.Builder()
        .setTargetRotation(windowManager.defaultDisplay.rotation)
        .build()

    _preview.setSurfaceProvider(previewView.previewSurfaceProvider)

    _cameraSelector = CameraSelector.Builder()
        .requireLensFacing(_requiredCameraLens)
        .build()

    _imageAnalyzer = ImageAnalysis.Builder()
        .setTargetResolution(Size(_imageWidth, _imageHeight))
        .setBackpressureStrategy(_imageBackpressureStrategy)
        .build()

    _imageAnalyzer.setAnalyzer(_imageExecutor,_analyzer)

    startPreview()

    _cameraProvider.bindToLifecycle(_lifecycleOwner, _cameraSelector, _imageAnalyzer)
}

// Called after image processing has finished
fun startPreview(){
    _cameraProvider.bindToLifecycle(_lifecycleOwner, _cameraSelector, _preview)
}

// Called when object is detected in an image
fun stopPreview(){
    _cameraProvider.unbind(_preview)
}

1 Ответ

1 голос
/ 26 февраля 2020

Я не тестировал свое решение в Kotlin, но оно нормально работает в Java. В самом деле, если вы просто вызовете cameraProvider.bindToLifecycle (lifecycleOwner, cameraSelector, preview), это не приведет к повторному связыванию вашего предварительного просмотра. Фактически вы должны воссоздать предварительный просмотр и сбросить провайдера поверхности. Например, в Java, когда я хочу повторить предварительный просмотр, я использую:

public void rebindPreview(){
    Preview preview = new Preview.Builder()
            .setTargetName("Preview")
            .build();
    preview.setSurfaceProvider(previewView.getPreviewSurfaceProvider());
    Camera camera = cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageCapture);
}

Я предполагаю, что для Kotlin вы можете сделать что-то вроде этого:

fun rebindPreview(){
    _preview = Preview.Builder()
            .setTargetRotation(windowManager.defaultDisplay.rotation)
            .setTargetName("Preview")
            .build()
    _preview.setSurfaceProvider(previewView.previewSurfaceProvider)
    _cameraProvider.bindToLifecycle(_lifecycleOwner, _cameraSelector, _preview)
}
...