Implementacja kodu QR w systemie Android

Mar 01 2023
Ostatnio stosowanie kodów QR staje się coraz bardziej powszechne, począwszy od płatności, menu restauracji, a skończywszy na mechanizmach zameldowania/wymeldowania, które zaczęto stosować w kilku biurach lub wejściach do miejsc publicznych. Zasadniczo kod QR ułatwia proces dostarczania danych konsumentom za pomocą unikalnego obrazu, który przedstawia same dane, w którym dane będą zarządzane przez konsumenta, aby ostatecznie móc określić, jakie działania należy podjąć.

Ostatnio stosowanie kodów QR staje się coraz bardziej powszechne, począwszy od płatności, menu restauracji, a skończywszy na mechanizmach zameldowania/wymeldowania, które zaczęto stosować w kilku biurach lub wejściach do miejsc publicznych.

Zasadniczo kod QR ułatwia proces dostarczania danych konsumentom za pomocą unikalnego obrazu, który przedstawia same dane, w którym dane będą zarządzane przez konsumenta, aby ostatecznie móc określić, jakie działania należy podjąć.

Zasadniczo QRCode to po prostu reprezentacja danych w unikalnej formie obrazów.

W rozwoju Androida możemy opracować dwie funkcje, które zostaną niezależnie zaimplementowane po naszej stronie.

Generator

Do generowania kodu QR możemy użyć tej biblioteki z 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
    }

Tutaj kodujemy zarówno dane, jak i BarcodeFormat, ponieważ chcemy być plikiem 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)

Jeśli chodzi o Skaner, musimy użyć tej biblioteki.

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

Nawiasem mówiąc, napisałem ten kod w jednym projekcie około 4 lata temu. Proszę spodziewać się przestarzałych zastosowań klasy/funkcji, jeśli takie istnieją, i być może istnieje nowe podejście do tego, jednym z nich jest użycie zestawu ML z plecaka odrzutowego.

Oto pełny kod kodu wyjaśnionego powyżej.

—