0
0

cameraxとmlkitでバーコード読み取り画面実装Part4

Last updated at Posted at 2024-07-18

はじめに

今回は長らく間を空けてしまっていたバーコード読み取り機能の最終パートになります

本文

実際にカメラのPreviewViewとUseCaseをカメラに紐づける部分の実装になります

@Composable
internal fun BarCodeCamera(
    modifier: Modifier = Modifier,
    useCase: UseCase,
) {
    Box(
        modifier = modifier
            .fillMaxWidth()
            .aspectRatio(PreviewRatio)
        ) {
        val context: Context = LocalContext.current
        val lifecycleOwner: LifecycleOwner = LocalLifecycleOwner.current
        AndroidView(
            modifier = Modifier.clipToBounds(),
            factory = { factoryContext ->
                PreviewView(factoryContext).apply {
                    layoutParams = LinearLayout.LayoutParams(
                        ViewGroup.LayoutParams.MATCH_PARENT,
                        ViewGroup.LayoutParams.WRAP_CONTENT,
                    )
                    implementationMode = PreviewView.ImplementationMode.COMPATIBLE
                    scaleType = PreviewView.ScaleType.FILL_CENTER
                }
            },
            update = { previewView ->
                val previewUseCase = Preview.Builder()
                    .build()
                    .apply {
                        setSurfaceProvider(previewView.surfaceProvider)
                    }
                context.startCamera(
                    lifecycleOwner = lifecycleOwner,
                    previewUseCase,
                    useCase,
                )
            },
        )
    }
}

private fun Context.startCamera(
    lifecycleOwner: LifecycleOwner,
    vararg useCases: UseCase,
) {
    val cameraProviderFuture = ProcessCameraProvider.getInstance(this)

    cameraProviderFuture.addListener({
        val cameraProvider = cameraProviderFuture.get()
        // 背面カメラを使用するように設定
        val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
        try {
            cameraProvider.unbindAll()
            cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, *useCases)
        } catch (e: Exception) {
            // TODO エラーハンドリング
            Timber.e(e, "Use case binding failed")
        }
    }, ContextCompat.getMainExecutor(this))
}

最後に

Part3を書いてから時間が空いてしまいましたが、これで全ての紹介をすることができました
どなたかのお役に立てれば幸いです

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0