Implementação de código QR no Android

Mar 01 2023
Recentemente, o uso de códigos QR tornou-se cada vez mais generalizado, desde pagamentos, menus de restaurantes até mecanismos de check-in/check-out que começaram a ser usados ​​em vários escritórios ou entradas de locais públicos. Basicamente, o QR Code facilita o processo de fornecimento de dados aos consumidores com uma imagem única que representa os próprios dados, onde os dados serão gerenciados pelo consumidor para, por fim, poder determinar qual ação precisa ser tomada.

Recentemente, o uso de códigos QR tornou-se cada vez mais generalizado, desde pagamentos, menus de restaurantes até mecanismos de check-in/check-out que começaram a ser usados ​​em vários escritórios ou entradas de locais públicos.

Basicamente, o QR Code facilita o processo de fornecimento de dados aos consumidores com uma imagem única que representa os próprios dados, onde os dados serão gerenciados pelo consumidor para, por fim, poder determinar qual ação precisa ser tomada.

Basicamente, o QRCode é apenas a representação de dados em forma de imagens únicas.

No desenvolvimento do Android, podemos experimentar as duas funções a serem implementadas de forma independente do nosso lado.

Gerador

Para gerar o QR Code, podemos usar esta biblioteca do 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
    }

Aqui, codificamos os dados e o BarcodeFormat como queremos que seja um arquivo 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)

Quanto ao Scanner, precisamos 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)
            }
        }
    }

A propósito, escrevi esse código em um projeto há cerca de 4 anos. Espere alguns usos obsoletos da classe/função, se houver, e talvez haja uma nova abordagem para isso, uma delas é usar o kit ML do jetpack.

Aqui está o código completo do código explicado acima.

—