Androidアプリでワンショットのコードスキャン機能が滅茶苦茶簡単に実装できるようになっていました。というネタ
この記事に書かれている通りなので、蛇足も蛇足ですが...アプリのメイン機能ではなく、特定の手続きで1回だけなど、QRコードを読み取り機能が欲しくなることはよくあります。
この方法を使えばカメラパーミッションも不要で、簡単にQRコードを読み取ることができます。(世の中にはカメラを搭載していない端末もあるので、プロダクトで利用する場合、その考慮は必要かと思いますが)
Google開発者サービスがスキャン機能を提供しており、アプリはスキャン結果のみを受けとるというものです。アプリがカメラ画像に一切アクセスしないため、プライバシーポリシーのケアなども(規約上は)不要です。
![]() |
![]() |
使い方
com.google.android.gms:play-services-code-scanner
をdependenciesに追加
dependencies {
...
implementation("com.google.android.gms:play-services-code-scanner:16.1.0")
}
AndroidManifestのapplication
タグ内にmeta-data
タグを追加
<manifest>
...
<application>
...
<meta-data
android:name="com.google.mlkit.vision.DEPENDENCIES"
android:value="barcode_ui"/>
</application>
</manifest>
GmsBarcodeScanning
を呼び出し、結果を受けとる
findViewById<View>(R.id.button).setOnClickListener {
GmsBarcodeScanning.getClient(this)
.startScan()
.addOnSuccessListener {
Toast.makeText(this, "${it.rawValue}", Toast.LENGTH_LONG).show()
}
}
以上!超簡単
読み取りの指定
この機能はQRコードだけではなく、バーコードを始め様々なコードを読み取ることが可能です。
実際のユースケースでは何か特定のフォーマットを読み取らせたいでしょうから、それを指定して利用するのが通常でしょう。その場合はGmsBarcodeScannerOptions
を使います。
val options = GmsBarcodeScannerOptions.Builder()
.setBarcodeFormats(Barcode.FORMAT_QR_CODE)
.build()
GmsBarcodeScanning.getClient(this, options)
...
とすれば、QRコードだけを読み取ってくれます。
また、16.1.0以降は、自動ズーム機能を指定することができます。
val options = GmsBarcodeScannerOptions.Builder()
.setBarcodeFormats(Barcode.FORMAT_QR_CODE)
.enableAutoZoom()
.build()
GmsBarcodeScanning.getClient(this, options)
...
私が使った範囲では、どういう条件でズームされるのかなどがいまいち分からず、便利なのかはよく分かりませんでした。
コールバック
startScan()
の戻り値はTask
ですので、success以外のコールバックも登録可能です。
GmsBarcodeScanning.getClient(this, options)
.startScan()
.addOnSuccessListener {
}
.addOnCanceledListener {
}
.addOnFailureListener {
}
.addOnCompleteListener {
}
失敗したりキャンセルされた場合にユーザーにメッセージを表示したりも簡単に実装できます。
以上です。