Skip to content
This repository has been archived by the owner on Oct 23, 2023. It is now read-only.

Commit

Permalink
feat(app): add PreviewViewComposable to show the camera preview stream
Browse files Browse the repository at this point in the history
  • Loading branch information
AndreaBrighi committed May 14, 2023
1 parent 1e723bc commit 09e46f3
Showing 1 changed file with 75 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package com.intelligentbackpack.app.ui.common

import android.util.Log
import androidx.camera.core.CameraSelector
import androidx.camera.core.ImageAnalysis
import androidx.camera.core.ImageCapture
import androidx.camera.core.Preview
import androidx.camera.lifecycle.ProcessCameraProvider
import androidx.camera.view.PreviewView
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.viewinterop.AndroidView
import androidx.core.content.ContextCompat
import com.intelligentbackpack.app.sensor.BarcodeAnalyser
import java.util.concurrent.Executors

@androidx.camera.core.ExperimentalGetImage
@Composable
fun PreviewViewComposable(modifier: Modifier, barcodeAnalyser: BarcodeAnalyser) {
val lifecycleOwner = LocalLifecycleOwner.current
var cameraProvider: ProcessCameraProvider? = null
DisposableEffect(key1 = cameraProvider) {
onDispose {
cameraProvider?.unbindAll() // closes the camera
}
}
AndroidView(
{ context ->
val cameraExecutor = Executors.newSingleThreadExecutor()
val previewView = PreviewView(context).also {
it.scaleType = PreviewView.ScaleType.FILL_CENTER
}
val cameraProviderFuture = ProcessCameraProvider.getInstance(context)
cameraProviderFuture.addListener({
cameraProvider = cameraProviderFuture.get()

val preview = Preview.Builder()
.build()
.also {
it.setSurfaceProvider(previewView.surfaceProvider)
}

val imageCapture = ImageCapture.Builder().build()

val imageAnalyzer = ImageAnalysis.Builder()
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
.build()
.apply {
setAnalyzer(cameraExecutor, barcodeAnalyser)
}

val cameraSelector = CameraSelector.Builder()
.requireLensFacing(CameraSelector.LENS_FACING_BACK)
.build()

try {
// Unbind use cases before rebinding
cameraProvider?.unbindAll()

// Bind use cases to camera
cameraProvider?.bindToLifecycle(
lifecycleOwner, cameraSelector, preview, imageCapture, imageAnalyzer
)

} catch (exc: Exception) {
Log.e("DEBUG", "Use case binding failed", exc)
}
}, ContextCompat.getMainExecutor(context))
previewView
},
modifier = modifier
)
}

0 comments on commit 09e46f3

Please sign in to comment.