AndroidでQRCodeを作成しよう
Android用のバーコードスキャナーライブラリの
journeyapps.comのzxing-android-embedded
を使用して文字列からQRコードを作成するアプリのご紹介です。
初めにgitのreadmeを参考にライブラリをAndroidプロジェクトに組み込みます。
ソースコードです。言語はKotlinです。
class MainActivity : AppCompatActivity() {
// QRコード化する文字列
private var textData = ""
// 画像のサイズ
private var size = 512
private val PNG_OUTPUT_REQUEST_CODE = 1
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// ACTION_SENDで渡されたデータからQRCodeを作成する
val intent = intent
val action = intent.action
if (Intent.ACTION_SEND == action) {
val extras = intent.extras
if (extras != null) {
val txt = extras.getString(Intent.EXTRA_TEXT)
if (!txt.isNullOrEmpty()) {
textData = txt
editText.setText(txt)
generateQRCode()
}
}
}
// editTextに入力されているテキストからQRCodeを作成する
generateButton.setOnClickListener {
textData = editText.text.toString()
generateQRCode()
}
// imageViewに表示されている画像を出力する
saveButton.setOnClickListener {
doOutPutFile("image/png", "", PNG_OUTPUT_REQUEST_CODE)
}
}
// ライブラリを利用してQRCodeのbitmapを作成し、imageViewに表示する
private fun generateQRCode()
{
try{
val barcodeEncoder = BarcodeEncoder()
//
val bitmap = barcodeEncoder.encodeBitmap(textData, BarcodeFormat.QR_CODE, size, size)
imageView.setImageBitmap(bitmap)
}catch(e : Exception)
{
}
}
// ACTION_CREATE_DOCUMENTインテントを使用した出力メソッド
private fun doOutPutFile(mimeType: String, fileName: String, requestCode : Int) {
// ストレージアクセスフレームワークを使った ドキュメントファイル作成用のインテント
val intent = Intent(Intent.ACTION_CREATE_DOCUMENT)
// mimeTypeの設定
intent.type = mimeType
// 保存先ファイル名を設定
intent.putExtra(Intent.EXTRA_TITLE, fileName)
startActivityForResult(intent, requestCode)
}
// startActivityForResultの結果を受け取る
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
// PNG用のリクエスト かつ 結果が成功であればPNGの書き込みを行う
if(requestCode == PNG_OUTPUT_REQUEST_CODE && resultCode == Activity.RESULT_OK)
{
// データのnullチェック
if(data?.data != null)
{
val uri = data.data
try{
// dataから取得したuriに関連付けられたコンテンツへのOutputStreamを開く
val outputStream = contentResolver.openOutputStream(uri!!)
val outPutBitmap = Bitmap.createBitmap(
imageView.width,
imageView.height,
Bitmap.Config.ARGB_8888
)
val outPutCanvas = Canvas(outPutBitmap)
// QRコードが表示されているimageViewから出力用Canvasに描き込む
imageView.draw(outPutCanvas)
// PNG形式で出力
outPutBitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream)
}catch (e : Exception)
{
// エラーが起きたら
// Uriが指し示す先のファイルを削除する。
DocumentsContract.deleteDocument(contentResolver, uri!!)
}
}
}
}
}
ライブラリを使ってQRCodeを作成しているのは
generateQRCode 関数です。
BarcodeEncoderのメソッドencodeBitmap()に
テキストデータ、フォーマット(今回はQRCode)、画像の幅と高さ
を引数に渡すだけでQRCodeのBitmapを返してくれます。
このBitmapをImageViewに表示したり、
画像ファイルとして出力しています。

onCreateでインテントから情報を受けている箇所がありますが、
ここでは、暗黙的Intent ”android.intent.action.SEND”
で情報を受け取り、その情報をQRCodeとして出力しています。
こうすることで、例えばブラウザアプリからURLを選択し「共有」から
このアプリを選択すればそのURLをQRCodeにすることができます。

ライブラリを使用することで簡単にQRCode化することができましたね。
水曜担当:Tanaka
tanaka at 2020年08月19日 10:00:33