#android #kotlin #android-camerax #google-mlkit
Вопрос:
Я создаю простой qr-сканер с помощью Camerax и Google ML Kit. Я открываю намерение после извлечения строкового значения из QR-кода. Проблема , с которой я сталкиваюсь, заключается в том, что намерение открывается несколько раз. Как мне решить эту проблему?
Ниже приведена настройка для анализа изображений.Намерение DisplayQR откроется после получения строкового значения внутри QR-кода.
val imageAnalysis = ImageAnalysis.Builder()
.setTargetResolution(Size(640, 480))
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
.build()
imageAnalysis.setAnalyzer(
ContextCompat.getMainExecutor(this),
CodeAnalyzer(this, object : CallBackInterface {
override fun onSuccess(qrString: String?) {
imageAnalysis.clearAnalyzer()
Toast.makeText(this@ActivityQR,qrString,Toast.LENGTH_SHORT).show()
Log.d("rty",qrString.toString())
//the following intent is opening multiple times
val visitordetails =
Intent(this@ActivityQR, DisplayQR::class.java)
visitordetails.putExtra("VISITOR_QR", qrString)
startActivity(visitordetails)
}
override fun onFailed() {
}
})
)
cameraProvider.bindToLifecycle(this, selectedCamera, imageAnalysis, cameraPreview)
Код для анализа изображения
class CodeAnalyzer(context: Context, callBackInterface: CallBackInterface):imageAnalysis.Analyzer {
private val context: Context = context
private val callback: CallBackInterface = callBackInterface
@SuppressLint("UnsafeOptInUsageError")
override fun analyze(image: ImageProxy) {
var scanner: BarcodeScanner = BarcodeScanning.getClient()
val scannedIMage = image.image
if (scannedIMage != null) {
var scannedInputImage = InputImage.fromMediaImage(
scannedIMage,
image.imageInfo.rotationDegrees
)
scanner.process(scannedInputImage).addOnSuccessListener { barCodes ->
for (qrCode in barCodes) {
when (qrCode.valueType) {
Barcode.TYPE_TEXT -> {
val qrString: String? = qrCode.rawValue
if (qrString != null) {
callback.onSuccess(qrString) //Here I am calling the callback
}
}
}
}
}.addOnFailureListener {
}.addOnCompleteListener {
image.close()
}
}
}
}
Изменить: Исправлено название действия
Комментарии:
1. Я предполагаю, что это связано с тем, что анализ MLKit является асинхронным, поэтому в промежутке между началом анализа изображения и запуском
onSuccess
обратного вызова для анализа могли быть переданы и другие кадры. Возможно, вы захотите убедиться, что это так.2. Вы используете его с предварительным просмотром камеры? или режим с одним изображением? Сколько штрих-кодов у вас в одном кадре? Я видел, что у вас есть цикл для всех обнаруженных штрих-кодов.