Как остановить многократное открытие намерения после сканирования QR-кода с помощью camerax и варианта использования анализа изображений?

#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. Вы используете его с предварительным просмотром камеры? или режим с одним изображением? Сколько штрих-кодов у вас в одном кадре? Я видел, что у вас есть цикл для всех обнаруженных штрих-кодов.