在我的应用中,尝试使用ML-Kit Vision库处理条形码时呈现预览真的很不可靠。我认为这是由于我对背景剧和可运行物品缺乏了解。
我已经按照一些Google / Firebase快速入门指南设置了我的应用程序,并且Camera2预览正常。
我还设置了onImageAvailableListener回调
/**
* This a callback object for the [ImageReader]. "onImageAvailable" will be called when a
* preview frame is ready to be processed.
*/
private val onImageAvailableListener = ImageReader.OnImageAvailableListener {
// Processing code here
}
这是我的第一次尝试。使用mediaImage发布到后台处理程序,然后在BarcodeProcessor中调用image.close()。
/**
* This a callback object for the [ImageReader]. "onImageAvailable" will be called when a
* preview frame is ready to be processed.
*/
private val onImageAvailableListener = ImageReader.OnImageAvailableListener {
val mediaImage = it.acquireNextImage()
backgroundHandler?.post(BarcodeProcessor(mediaImage, barcodeDetector))
}
internal class BarcodeProcessor(
private val image: Image,
private val barcodeDetector: FirebaseVisionBarcodeDetector
) : Runnable {
override fun run() {
Log.d(TAG, "run")
try {
val firebaseVisionImage = FirebaseVisionImage.fromMediaImage(image, 1)
// ... more processing
} catch (e: IOException) {
Log.e(TAG, e.toString())
} finally {
image.close()
}
}
companion object {
/**
* Tag for the [Log].
*/
private val TAG = "BarcodeProcessor"
}
}
问题是onImageAvailableListener会将多个图像中的图像发布到backgroundHandler而不及时关闭它们。 val firebaseVisionImage = FirebaseVisionImage.fromMediaImage(image, 1)
确实很慢,这是问题的一部分。
第二次尝试
在这里,我尝试在调用backgroundHandler
之后立即关闭图像。这种方法的问题是backgroundHandler
/**
* This a callback object for the [ImageReader]. "onImageAvailable" will be called when a
* preview frame is ready to be processed.
*/
private val onImageAvailableListener = ImageReader.OnImageAvailableListener {
val mediaImage = it.acquireNextImage()
backgroundHandler?.post(BarcodeProcessor(mediaImage, barcodeDetector))
mediaImage.close()
}
internal class BarcodeProcessor(
private val image: Image,
private val barcodeDetector: FirebaseVisionBarcodeDetector
) : Runnable {
override fun run() {
Log.d(TAG, "run")
try {
val firebaseVisionImage = FirebaseVisionImage.fromMediaImage(image, 1)
// ... more processing
} catch (e: IOException) {
Log.e(TAG, e.toString())
} finally {
}
}
companion object {
/**
* Tag for the [Log].
*/
private val TAG = "BarcodeProcessor"
}
}
任何帮助/提示/指导将不胜感激。
我现在从相机学习条形码扫描,github上的示例对我有所帮助。也许会对您有帮助https://github.com/firebase/quickstart-android/tree/master/mlkit