В моем приложении предварительный просмотр при попытке обработки штрих-кодов с использованием библиотеки ML-Kit Vision действительно прерывистый. Я думаю, что это из-за моего непонимания фоновых функций и запуска.
Я настроил свое приложение, следуя нескольким руководствам по быстрому запуску Googles / 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 и вызывайте image.close () в BarcodeProcessor.
/**
* 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"
}
}
. Любая помощь / советы / указания будут с благодарностью.