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



アプリ関連ニュース

お問い合わせはこちら

お問い合わせ・ご相談はお電話、またはお問い合わせフォームよりお受け付けいたしております。

tel. 06-6454-8833(平日 10:00~17:00)

お問い合わせフォーム