Android での QR コードの実装

Mar 01 2023
最近、QR コードの使用は、支払い、レストランのメニューからチェックイン/チェックアウトの仕組みに至るまで、ますます普及しており、いくつかのオフィスや公共の場所の入り口で使用され始めています。基本的に、QR コードは、データ自体を表す固有の画像を使用して消費者にデータを提供するプロセスを容易にし、データは消費者によって管理され、最終的にどのようなアクションを実行する必要があるかを決定できるようになります。

最近、QR コードの使用は、支払い、レストランのメニューからチェックイン/チェックアウトの仕組みに至るまで、ますます普及しており、いくつかのオフィスや公共の場所の入り口で使用され始めています。

基本的に、QR コードは、データ自体を表す固有の画像を使用して消費者にデータを提供するプロセスを容易にし、データは消費者によって管理され、最終的にどのようなアクションを実行する必要があるかを決定できるようになります。

基本的に、QRCode はデータを独自の画像形式で表現したものにすぎません。

Android 開発では、2 つの機能を専門的に開発し、独自に実装することができます。

発生器

QR コードを生成するには、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
    }

ここでは、データと BarcodeFormat の両方を、 にしたいようにエンコードします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)

スキャナに関しては、このライブラリを使用する必要があります。

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

ちなみに、私はそのコードを 4 年ほど前に 1 つのプロジェクトに書きました。クラス/関数の非推奨の使用法が存在する場合は、それを想定してください。また、これに対する新しいアプローチがある可能性があります。その 1 つは、jetpack の ML キットを使用することです。

上記で説明したコードの完全なコードは次のとおりです。

—