Skip to content

Commit

Permalink
use ProcessCameraProvider.awaitInstance()
Browse files Browse the repository at this point in the history
  • Loading branch information
solrudev committed Dec 18, 2024
1 parent 7467584 commit 10238f7
Showing 1 changed file with 26 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,12 @@ import androidx.camera.core.CameraSelector
import androidx.camera.core.ImageAnalysis
import androidx.camera.core.Preview
import androidx.camera.lifecycle.ProcessCameraProvider
import androidx.camera.lifecycle.awaitInstance
import androidx.camera.view.TransformExperimental
import androidx.core.content.ContextCompat
import androidx.core.widget.addTextChangedListener
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import by.kirich1409.viewbindingdelegate.viewBinding
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import dagger.hilt.android.AndroidEntryPoint
Expand All @@ -26,6 +27,7 @@ import kotlinx.coroutines.flow.distinctUntilChangedBy
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
import ru.solrudev.facerecognizer.R
import ru.solrudev.facerecognizer.databinding.DialogAddFaceBinding
import ru.solrudev.facerecognizer.databinding.FragmentCaptureFaceBinding
Expand Down Expand Up @@ -117,26 +119,29 @@ class FaceCaptureFragment : Fragment(R.layout.fragment_capture_face) {
this.faceRecognitionAnalyzer = faceRecognitionAnalyzer
faceRecognitionResultsRenderJob?.cancel()
faceRecognitionResultsRenderJob = faceRecognitionAnalyzer.startResultsRender()
val cameraProviderFuture = ProcessCameraProvider.getInstance(requireContext())
cameraProviderFuture.addListener({
if (binding.previewViewFaceCapture.display == null) {
return@addListener
}
val cameraProvider = cameraProviderFuture.get()
val preview = Preview.Builder()
.build()
.also { it.setSurfaceProvider(binding.previewViewFaceCapture.surfaceProvider) }
val imageAnalysis = ImageAnalysis.Builder()
.setTargetRotation(binding.previewViewFaceCapture.display.rotation)
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
.build()
.also { it.setAnalyzer(cameraExecutor, faceRecognitionAnalyzer) }
val cameraSelector = CameraSelector.Builder()
.requireLensFacing(cameraLens)
.build()
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageAnalysis)
}, ContextCompat.getMainExecutor(requireContext()))
lifecycleScope.launch {
startCamera(faceRecognitionAnalyzer, cameraLens)
}
}

private suspend inline fun startCamera(analyzer: FaceRecognitionAnalyzer, cameraLens: Int) {
val cameraProvider = ProcessCameraProvider.awaitInstance(requireContext())
if (binding.previewViewFaceCapture.display == null) {
return
}
val preview = Preview.Builder()
.build()
.also { it.surfaceProvider = binding.previewViewFaceCapture.surfaceProvider }
val imageAnalysis = ImageAnalysis.Builder()
.setTargetRotation(binding.previewViewFaceCapture.display.rotation)
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
.build()
.also { it.setAnalyzer(cameraExecutor, analyzer) }
val cameraSelector = CameraSelector.Builder()
.requireLensFacing(cameraLens)
.build()
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageAnalysis)
}

private fun showAddFaceDialog(dialog: AddFaceDialog) {
Expand Down

0 comments on commit 10238f7

Please sign in to comment.