我正在尝试使用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()
也会完全重置图像分析。
clearAnalyzer()
存在问题
我正在使用直到修复为止:
fun enableAnalysis(enable: Boolean) {
if (!enable) {
isAnalyzerSet = false
imageAnalysisUseCase?.clearAnalyzer()
imageAnalysisUseCase.setAnalyzer(analysisExecutor, ImageAnalysis.Analyzer { })
} else {
if (isAnalyzerSet) return
isAnalyzerSet = true
imageAnalysisUseCase?.setAnalyzer(analysisExecutor, analyzer)
}
}