我正在尝试使用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)
}
})
}
}在翻遍了所有的库源代码之后,我仍然不明白如何才能达到预期的效果?
如果我在processCameraProvider上调用unbind(imageAnalysisUseCase object),我就不能再次绑定该对象(processCameraProvider只有bindToLifecycle()方法,没有bind(imageAnalysisUseCase object))。
尽管再次调用setAnalyzer(),但在ImageAnalysis上调用clearAnalyzer()会完全重置图像分析。
发布于 2020-03-06 04:21:09
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)
}
}发布于 2020-03-08 16:04:19
如果您只想在处理图像时不处理任何图像,则可以在分析方法中设置一个标记,如果正在处理图像,该标记将立即返回。如下所示:
class MyViewModel: ViewModel() {
private var isProcessing = false
fun handleBarcode(text: String) {
if (isProcessing) {
return
}
// Do your processing here.
}
}如果调用processCameraProvider.unbind(imageAnalysis),则可以通过使用相同的实例调用processCameraProvider.bindToLifecycle(, , imageAnalysis)来再次绑定用例,但我不确定这是否有效。重新绑定相同的预览用例实例不起作用,我不确定该规则是否适用于ImageAnalysis。
发布于 2021-06-21 17:55:25
您可以要求生产者一次生成一个图像,直到您关闭代理为止。
ImageAnalysis imageAnalysis = imageAnalysisBuilder.setBackpressureStrategy(ImageAnalysis.STRATEGY_BLOCK_PRODUCER).setImageQueueDepth(1).build();在文档中,https://developer.android.com/reference/androidx/camera/core/ImageAnalysis#STRATEGY_BLOCK_PRODUCER
阻止制作人生成新图像。
一旦生产者产生了与图像队列深度相等的图像数量,并且没有一个图像被关闭,那么生产者将停止产生图像。请注意,图像可能会在内部排队,直到使用ImageProxy.close()关闭最后一个发送的图像后才会发送到分析器
https://stackoverflow.com/questions/60322550
复制相似问题