AndroidアプリでQRコードを生成する方法をまとめました
ざっと やること
- gradleに依存関係[ implementation ‘com.journeyapps:zxing-android-embedded:4.3.0’ ]を追加
- MultiFormatWriter クラスをインスタンス化
- MultiFormatWriter クラスのencode メソッドを使用しBitMatrix を作る
- BitMatrixをBitmapに変換する
全部 なにそれ
しらない登場人物の説明
- MultiFormatWriter クラス とは
→ 要求された内容でバーコードをエンコードするクラスのこと
- BitMatrix とは
→ QRコードのデータを保持する二次元配列のこと
QRコードの白黒のパターンが、0と1のビット列で表現されており、MultiFormatWriter
クラスのencode()メソッドによって生成され、QRコードのパターンとそのサイズを指定することができる。
- Bitmap とは
→ Androidで画像を表現するために使用されるクラスで、ビットマップ形式のイメージを表す。 BarcodeEncoderのcreateBitmap()メソッド
によってBitMatrixを Bitmap
に変換する。 変換後、Bitmap
は画像として表示することができる。
使用するライブラリ
- Android開発でQRコード生成や読み取りといったら、このライブラリ!!
コードを書いてみる
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)