LoginSignup
5
5

More than 1 year has passed since last update.

【Android/Kotlin】QRコードを生成する

Last updated at Posted at 2023-04-20

QRコード生成

やること

  • gradleに追加
    implementation 'com.journeyapps:zxing-android-embedded:4.3.0
  • MultiFormatWriter クラスをインスタンス化
  • MultiFormatWriter クラスの encode メソッドを使用し BitMatrix を作る

しらない登場人物の説明

  • MultiFormatWriter クラス
    → 要求された内容でバーコードをエンコードするクラス
  • BitMatrix
    → QRコードのデータを保持する二次元配列。
     QRコードの白黒のパターンが、0と1のビット列で表現されており、MultiFormatWriterクラスのencode()メソッドによって生成され、QRコードのパターンとそのサイズを指定する。
  • Bitmap
    → Androidで画像を表現するために使用されるクラスで、ビットマップ形式のイメージを表す。BarcodeEncodercreateBitmap()メソッドによってBitMatrixBitmapに変換する。
    変換後、Bitmapは画像として表示することができる。

使用するライブラリの説明

こだわりポイント

  • 関数を分けることで一つの関数の役割を明確に、可読性も高くする

作ってみる

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 メソッドを使用して、BitMatrixBitmapに変換する
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)
<ImageView
    android:id="@+id/qr_image"
    android:layout_width="250dp"
    android:layout_height="250dp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent" />
ImageView にこのようなQRコードが埋め込まれる

Untitled.png

さいごに

QRコード生成のbitmapやらBitMatrixやらがなんなのかわからずQRコード生成にてこずったのでまとめてみました。
がんばるぞい!

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5