Я пытаюсь реализовать сканер штрих-кода с использованием библиотеки сканирования штрих-кода CameraX и ZXing.
Я написал собственный анализатор, который декодирует штрих-коды, и эти штрих-коды должны быть обработаны (логика обработки, очевидно, занимает некоторое время).
Поэтому я хочу отключить анализ изображений на лету и снова включить его, если результат операции обработки не удался.
Моя базовая логика настройки:
private fun setupCamera() {
processCameraProvider.unbindAll()
val camera = processCameraProvider.bindToLifecycle(
this,
CameraSelector.DEFAULT_BACK_CAMERA,
buildPreviewUseCase(),
buildImageAnalysisUseCase())
}
private fun buildPreviewUseCase(): Preview {
return Preview.Builder()
.setTargetRotation(cameraPreview.display.rotation)
.build()
.apply {
previewSurfaceProvider = cameraPreview.previewSurfaceProvider
}
}
private fun buildImageAnalysisUseCase(): ImageAnalysis {
return ImageAnalysis.Builder()
.setTargetRotation(cameraPreview.display.rotation)
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
.build()
.apply {
setAnalyzer(Executors.newSingleThreadExecutor(),
ZxingBarcodeAnalyzer { qrResult ->
Handler(Looper.getMainLooper()).post {
viewModel.handleBarcode(qrResult.text)
}
})
}
}
Покопавшись в источниках библиотеки, я все еще не понимаю, как добиться желаемого поведения?
Если я вызываю unbind(imageAnalysisUseCase object)
на processCameraProvider
, я не могу снова связать этот объект (processCameraProvider
имеет только метод bindToLifecycle()
, а не bind(imageAnalysisUseCase object)
).
Вызов clearAnalyzer()
на ImageAnalysis
полностью сбрасывает анализ изображения, несмотря на повторный вызов setAnalyzer()
.