はじめに
今回は長らく間を空けてしまっていたバーコード読み取り機能の最終パートになります
本文
実際にカメラの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を書いてから時間が空いてしまいましたが、これで全ての紹介をすることができました
どなたかのお役に立てれば幸いです