Implementación de código QR en Android

Mar 01 2023
Recientemente, el uso de códigos QR se ha generalizado cada vez más, abarcando desde pagos, menús de restaurantes hasta mecanismos de check-in/check-out que han comenzado a utilizarse en varias oficinas o entradas a lugares públicos. Básicamente, QR Code facilita el proceso de proporcionar datos a los consumidores con una imagen única que representa los datos en sí mismos, donde el consumidor administrará los datos para, en última instancia, poder determinar qué acción debe tomarse.

Recientemente, el uso de códigos QR se ha generalizado cada vez más, abarcando desde pagos, menús de restaurantes hasta mecanismos de check-in/check-out que han comenzado a utilizarse en varias oficinas o entradas a lugares públicos.

Básicamente, QR Code facilita el proceso de proporcionar datos a los consumidores con una imagen única que representa los datos en sí mismos, donde el consumidor administrará los datos para, en última instancia, poder determinar qué acción debe tomarse.

Básicamente, QRCode es solo una representación de datos en forma de imágenes únicas.

En el desarrollo de Android, podemos experimentar las dos funciones para que se implementen de forma independiente de nuestro lado.

Generador

Para generar código QR, podemos usar esta biblioteca de google.

implementation 'com.google.zxing:core:3.2.1

private fun generatedQR(value: String): Bitmap? {
        val bitMatrix: BitMatrix
        try {
            bitMatrix = MultiFormatWriter().encode(
                    value,
                    BarcodeFormat.QR_CODE,
                    500, 500, null
            )

        } catch (e: IllegalArgumentException) {
            return null
        }

        val bitMatrixWidth = bitMatrix.width

        val bitMatrixHeight = bitMatrix.height

        val pixels = IntArray(bitMatrixWidth * bitMatrixHeight)

        for (y in 0 until bitMatrixHeight) {
            val offset = y * bitMatrixWidth

            for (x in 0 until bitMatrixWidth) {

                pixels[offset + x] = if (bitMatrix.get(x, y))
                    ContextCompat.getColor(this, R.color.black)
                else
                    ContextCompat.getColor(this, R.color.white)
            }
        }
        val bitmap = Bitmap.createBitmap(bitMatrixWidth, bitMatrixHeight, Bitmap.Config.ARGB_8888)

        bitmap.setPixels(pixels, 0, 500, 0, 0, bitMatrixWidth, bitMatrixHeight)
        return bitmap
    }

Aquí codificamos tanto los datos como el BarcodeFormat como queremos que sea un archivo bitMatrix.

val bitMatrix: BitMatrix
        try {
            bitMatrix = MultiFormatWriter().encode(
                    value,
                    BarcodeFormat.QR_CODE,
                    500, 500, null
            )

        } catch (e: IllegalArgumentException) {
            return null
        }

val bitmap = generatedQR(args)
imageView.setImageBitmap(bitmap)

En cuanto al Escáner, necesitamos usar esta biblioteca.

implementation 'com.journeyapps:zxing-android-embedded:3.6.0'

val scanner = IntentIntegrator(this)
            scanner.setDesiredBarcodeFormats(IntentIntegrator.QR_CODE)
            scanner.setBeepEnabled(true) //optional
            scanner.initiateScan()

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        if (resultCode == Activity.RESULT_OK) {
            val result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data)
            if (result != null) {
                if (result.contents == null) {
                    toast("Cancelled !")
                } else {
                    textView.text = "Your data from scanner is ${result.contents}" //do whatever you want with the data
                }
            } else {
                super.onActivityResult(requestCode, resultCode, data)
            }
        }
    }

Por cierto, escribí ese código en un proyecto hace unos 4 años. Espere algunos usos obsoletos de la clase/función, si los hay, y tal vez haya un nuevo enfoque para esto, uno de ellos es usar el kit ML de jetpack.

Aquí está el código completo del código explicado anteriormente.

—