diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/newchat/QRCodeScanner.kt b/apps/android/app/src/main/java/chat/simplex/app/views/newchat/QRCodeScanner.kt index 5d594b98b3..e0ee944195 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/views/newchat/QRCodeScanner.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/views/newchat/QRCodeScanner.kt @@ -30,6 +30,16 @@ fun QRCodeScanner(onBarcode: (String) -> Unit) { var lastAnalyzedTimeStamp = 0L var contactLink = "" + val cameraProviderFuture by produceState?>(initialValue = null) { + value = ProcessCameraProvider.getInstance(context) + } + + DisposableEffect(lifecycleOwner) { + onDispose { + cameraProviderFuture?.get()?.unbindAll() + } + } + AndroidView( factory = { AndroidViewContext -> PreviewView(AndroidViewContext).apply { @@ -46,14 +56,10 @@ fun QRCodeScanner(onBarcode: (String) -> Unit) { .requireLensFacing(CameraSelector.LENS_FACING_BACK) .build() val cameraExecutor: ExecutorService = Executors.newSingleThreadExecutor() - val cameraProviderFuture: ListenableFuture = - ProcessCameraProvider.getInstance(context) - - cameraProviderFuture.addListener({ + cameraProviderFuture?.addListener({ preview = Preview.Builder().build().also { it.setSurfaceProvider(previewView.surfaceProvider) } - val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get() val detector: QrCodeDetector = FactoryFiducial.qrcode(null, GrayU8::class.java) fun getQR(imageProxy: ImageProxy) { val currentTimeStamp = System.currentTimeMillis() @@ -78,8 +84,8 @@ fun QRCodeScanner(onBarcode: (String) -> Unit) { .build() .also { it.setAnalyzer(cameraExecutor, imageAnalyzer) } try { - cameraProvider.unbindAll() - cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, preview, imageAnalysis) + cameraProviderFuture?.get()?.unbindAll() + cameraProviderFuture?.get()?.bindToLifecycle(lifecycleOwner, cameraSelector, preview, imageAnalysis) } catch (e: Exception) { Log.d(TAG, "CameraPreview: ${e.localizedMessage}") }