🔥
【Android App】QRcode で情報共有
概要
アプリ名
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 が実行するという流れになっている。
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