🔥

【Android App】QRcode で情報共有

2023/10/25に公開

https://github.com/rakuda20211215/androidJava_QRCode
https://youtu.be/eUfaPFgKXek

概要

アプリ名

I・AM

IDE

Android Studio Dolphin

使用言語

Android Java
c/c++
Google Apps Script

制作期間

4 ヶ月

アプリ機能

相手の qrcode を読み取るか、 相手に読み取らせることでお互いの簡単な情報を交換できる。
読み取ったデータはデータベースへ保存され、 今まで交換してきた履歴が確認可能。

Account 作成

Google account と LINE account のどちらかで作成する。

Database

データベース作成は、 Google Cloud Platform の mysql を使用している。
データベースとのやり取りは Google apps script (通称ギャス (Gas)) を経由して行う。
Gas で公開した webapi に対して post メソッドでリクエストを送り、
リクエストに応じたクエリを Gas が実行するという流れになっている。

Gas のコード

Qrcode 関係

Qrcode の作成には ZXing を使用。

コード
private Bitmap createQRCode(String contents){
    Bitmap qrBitmap = null;
    try {
        // QRコードの生成
        QRCodeWriter qrcodewriter = new QRCodeWriter();
        BitMatrix qrBitMatrix = qrcodewriter.encode(
                                    contents,
                                    BarcodeFormat.QR_CODE,
                                    300,
                                    300);
        // createBitmap(int[] colors, int width, int height, Bitmap.Config config)
        qrBitmap = Bitmap.createBitmap(300, 300, Bitmap.Config.ARGB_8888);
        // setPixels(int[] pixels, int offset, int stride, int x, int y, int width, int height)
        qrBitmap.setPixels(this.createDot(qrBitMatrix), 0, 300, 0, 0, 300, 300);
    }
    catch(Exception ex)
    {
        // エンコード失敗
        Toast.makeText(getApplicationContext(), ex.toString(), Toast.LENGTH_SHORT).show();
    }
    finally
    {
        return qrBitmap;
    }
}

// ドット単位の判定
private int[] createDot(BitMatrix qrBitMatrix){
    // 縦幅・横幅の取得
    int width = qrBitMatrix.getWidth();
    int height = qrBitMatrix.getHeight();
    // 枠の生成
    int[] pixels = new int[width * height];
    // データが存在するところを黒にする
    for (int y = 0; y < height; y++)
    {
        // ループ回数盤目のOffsetの取得
        int offset = y * width;
        for (int x = 0; x < width; x++)
        {
            // データが存在する場合
            if (qrBitMatrix.get(x, y))
            {
                pixels[offset + x] = Color.BLACK;
            }
            else
            {
                pixels[offset + x] = getColor(R.color.clear);
            }
        }
    }
    return pixels;
}

Qrcode の読み取りは openCV の画像処理を使用。

コード
//毎フレーム呼ばれる(返り値は、変更された表示する必要のあるフレーム)
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
    if(cv_frag) {
        // 表示する画像を更新
        mRgba = inputFrame.rgba();
        mGray = inputFrame.rgba();

        // QRcodeの検出
        // detectメソッドで画像から検出されたポイントをポイントの配列にセット
        if (mQRCodeDetector.detect(mGray, mPoints)) {
            try {
                // QRcode解析
                // 検出されたポイントを使用し画像内のグラフィカルコードを検出し、デコード
                result = mQRCodeDetector.decode(mGray, mPoints);

                // 文字が検出された際の処理
                if (result != null && result.length() > 1) {
                    // qrcode検出停止
                    cv_frag = false;

                    // QRcode四角形の描画
                    drawQuadrangle();
		    
		    Log.i("tag", result);
                }
            } catch (CvException e) {
                e.printStackTrace();
            }
        }
    }
    else {
        drawQuadrangle();
    }
    return mRgba;
}

作った経緯

当時、 新型コロナウィルスの影響により隔週でリモート授業を行っていたため、クラスメイトとの交流が減り、 仲を深めることが難しい状況となっていた。
この状況をふまえ、 「 最速 でお互いについて知ることのできるアプリを作ろう」という意見が上がり、 制作を開始した。

こだわり

  • SNS アカウントによるログイン
    こういったソーシャルログインを使用すると、
    SNS の多要素認証を利用できるので、セキュリティの向上につながる。
    また、Id やパスワードを保管する必要がなくユーザー情報の管理が容易になるという利点がある。
  • QRcode を利用
    近年 QRcode の利用が活発になってきているため、 学習の一環として QRcode を利用。
    作った経緯にもあるように、 最速での情報共有を目指していたため、 そこを実現するために
    QRcode を取り入れた。

おわりに

この記事を執筆した日から約一年前に作成したものです。
 いま見返してみればお粗末な点がいくつか見受けられ、自分も少しは成長しているのかと実感しました。
現在はカレンダーのIOSアプリを制作中なので、いずれポートフォリオとして別の記事でまとめたいと思います。

Discussion