外部のQRコード生成APIに頼らずアプリ内でQRコードを作成したかったので、ZXingライブラリを使ってやってみました。
準備
build.gradle のdependencies
に以下の記述を追加します。
dependencies {
...
compile 'com.google.zxing:core:3.2.1' // これを追加
}
QRコードのBitmap作成メソッド
ZXingはAndroidに限らないJava向けの汎用ライブラリなので、Android固有のBitmap等へ変換する箇所は自分で実装する必要があります。
といっても、QRコードの黒く塗るべきドットとそうでないドットはZXingが教えてくれるので、それを使ってBitmapを生成するのは簡単です。
public static Bitmap generateQR(String qrText, int size = 500) throws WriterException {
// QRコードのビットマトリクスを作成
QRCode qrCode = Encoder.encode(qrText, ErrorCorrectionLevel.H);
ByteMatrix byteMatrix = qrCode.getMatrix();
// QRコードのサイズのBitmapを作成
Bitmap bitmap = Bitmap.createBitmap(byteMatrix.getWidth(), byteMatrix.getHeight(), Bitmap.Config.ARGB_8888);
// 各ピクセルを黒か白で埋める
for (int y = 0; y < byteMatrix.getHeight(); ++y) {
for (int x = 0; x < byteMatrix.getWidth(); ++x) {
byte val = byteMatrix.get(x, y);
bitmap.setPixel(x, y, val == 1 ? Color.BLACK : Color.WHITE);
}
}
// 必要な大きさに拡大する
bitmap = Bitmap.createScaledBitmap(bitmap, size, size, false);
return bitmap;
}
補足
Encoder.encode()
の第二引数はエラー訂正レベルです。ErrorCorrectionLevel.H
が最も高く、ErrorCorrectionLevel.Q
,ErrorCorrectionLevel.M
,ErrorCorrectionLevel.L
となるにつれて低くなります。
エラー訂正レベルが高いほうが、汚れ等でコードの一部が見えなくなっても正しく読み取れるようになりますが、その分データ量(画像サイズ)が大きくなります。
bitmap.setPixel()
の部分で実際の色を決めます。違う色にしたい場合はColor.RED
などに変更することも可能です。