Implementazione del codice QR in Android

Mar 01 2023
Recentemente si è diffuso sempre più l'uso dei codici QR, che vanno dai pagamenti, ai menu dei ristoranti, ai meccanismi di check-in/check-out che hanno iniziato ad essere utilizzati in diversi uffici o ingressi a luoghi pubblici. Fondamentalmente, il codice QR facilita il processo di fornitura di dati ai consumatori con un'immagine univoca che rappresenta i dati stessi, dove i dati saranno gestiti dal consumatore per essere in grado di determinare quale azione deve essere intrapresa.

Recentemente si è diffuso sempre più l'uso dei codici QR, che vanno dai pagamenti, ai menu dei ristoranti, ai meccanismi di check-in/check-out che hanno iniziato ad essere utilizzati in diversi uffici o ingressi a luoghi pubblici.

Fondamentalmente, il codice QR facilita il processo di fornitura di dati ai consumatori con un'immagine univoca che rappresenta i dati stessi, dove i dati saranno gestiti dal consumatore per essere in grado di determinare quale azione deve essere intrapresa.

Fondamentalmente, QRCode è solo una rappresentazione di dati in forma di immagini univoche.

Nello sviluppo di Android, possiamo sperimentare che le due funzioni vengano implementate indipendentemente dalla nostra parte.

Generatore

Per generare il codice QR, possiamo utilizzare questa libreria di 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
    }

Qui codifichiamo sia i dati che BarcodeFormat come vogliamo essere un file 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)

Per quanto riguarda lo scanner, dobbiamo utilizzare questa libreria.

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)
            }
        }
    }

A proposito, ho scritto quel codice in un progetto circa 4 anni fa. Si prega di aspettarsi alcuni usi deprecati della classe/funzione, se presenti, e forse c'è un nuovo approccio per questo, uno dei quali è l'utilizzo del kit ML di jetpack.

Ecco il codice completo del codice spiegato sopra.

—