AndroidアプリでQRコードを生成する方法をまとめました

ざっと やること

  • gradleに依存関係[ implementation ‘com.journeyapps:zxing-android-embedded:4.3.0’ ]を追加
  • MultiFormatWriter クラスをインスタンス化
  • MultiFormatWriter クラスのencode メソッドを使用しBitMatrix を作る
  • BitMatrixBitmapに変換する

全部 なにそれ

しらない登場人物の説明

  • MultiFormatWriter クラス とは

→ 要求された内容でバーコードをエンコードするクラスのこと

  • BitMatrix とは

→ QRコードのデータを保持する二次元配列のこと

QRコードの白黒のパターンが、0と1のビット列で表現されており、MultiFormatWriterクラスのencode()メソッドによって生成され、QRコードのパターンとそのサイズを指定することができる。

  • Bitmap とは

→ Androidで画像を表現するために使用されるクラスで、ビットマップ形式のイメージを表す。 BarcodeEncodercreateBitmap()メソッド

によってBitMatrixBitmapに変換する。 変換後、Bitmapは画像として表示することができる。

使用するライブラリ

  • Android開発でQRコード生成や読み取りといったら、このライブラリ!!
https://github.com/journeyapps/zxing-android-embedded

コードを書いてみる

QRコード生成

  • QRコードの生成に失敗したらcatch に入りエラーログを出力する
  • catch に入ったらなにもreturn しないため null をreturn する
/**
 * QRコードを生成する
 * @param data QRコード化したいデータ
 */
fun createQrCode(data: String): Bitmap? {
        return try {
            val bitMatrix = createBitMatrix(data)
            bitMatrix?.let { createBitmap(it) }
        } catch (e: Exception) {
            Log.e(simpleName, "${e.message}\n${e.stackTrace.joinToString("\n")}")
            null
        }
    }

BitMatrixを作成する

  • MultiFormatWriter をインスタンス化する
  • 変数hints に QRコードを生成するときのオプションを任意で追加する
  • MultiFormatWriter クラスのencode メソッドを使用してBitMatrixを生成する
/**
 * BitMatrixを作成する
 * @param data QRコード化したいデータ
 */
fun createBitMatrix(data: String): BitMatrix? {
      val multiFormatWriter = MultiFormatWriter()
      val hints = mapOf(
          // マージン
          EncodeHintType.MARGIN to 0,
          // 誤り訂正レベルを一番低いレベルで設定 エンコード対象のデータ量が少ないため
          EncodeHintType.ERROR_CORRECTION to ErrorCorrectionLevel.L
      )

       return multiFormatWriter.encode(
          data, // QRコード化したいデータ
          BarcodeFormat.QR_CODE, // QRコードにしたい場合はこれを指定
          200, // 生成されるイメージの高さ(px)
          200, // 生成されるイメージの横幅(px)
          hints // オプション
      )
  }

Bitmap を作成する

  • BarcodeEncoder をインスタンス化する
  • BarcodeEncoder クラスのcreateBitmap メソッドを使用して、BitMatrixをBitmapに変換する
fun createBitmap(bitMatrix: BitMatrix): Bitmap {
        val barcodeEncoder = BarcodeEncoder()
        return barcodeEncoder.createBitmap(bitMatrix)
    }

いよいよQRコードを作成する

  • QRコード化したいStringデータを引数にとる
  • BitMatrix 生成メソッドでBitMatrixを生成し変数に格納
  • Bitmap 生成メソッドでBitMatrixを引数にとり実行
  • 以上の処理とtry,catchし、結果をreturnする
fun createQrCode(data: String): Bitmap? {
        return try {
            val bitMatrix = createBitMatrix(data)
            bitMatrix?.let { createBitmap(it) }
        } catch (e: Exception) {
            // エラーハンドリングなどはよしなに
            null
        }
    }

QRコード生成メソッドを実行する

// Acticity
ImageView qrImage = findViewById(R.id.qr_image);

val qrCode = createQrCode("おつかれさまでした")

qrImage.setImageBitmap(qrCode)
// Acticity
ImageView qrImage = findViewById(R.id.qr_image);

val qrCode = createQrCode("おつかれさまでした")

qrImage.setImageBitmap(qrCode)

以外と簡単だった✌️