[Android+zxing]QRコードリーダーアプリを作る
はじめに
スマートフォンアプリの開発をやってみたいと思い、手始めにQRコードレーダーを作ってみました。まずはGoogleが提供しているZXingライブラリを使ってみようと思います。
この記事では、カメラやプレビューの処理はライブラリ内のアクティビティを使用している為、複雑な処理はなく実装できます。
開発環境
- Windows 10 64bit
- Android Studio 4.0
- zxing 4.1.0
- Kotlin
実行結果
この記事の内容を実行するとカメラが起動しQRコードを読み込みできます。
こちらの画像は、デバッグ実行した結果です。
コーディング
実際にコーディングしていきます。
Gradleファイルを編集
repositories { jcenter() } dependencies { ... implementation 'com.journeyapps:zxing-android-embedded:4.1.0' implementation 'androidx.appcompat:appcompat:1.0.2' ... }
SDKのバージョンが25以下だとコンパイルエラーが発生します。
[CIRCULAR REFERENCE:com.android.tools.r8.a: Invoke-customs are only supported starting with Android O (--min-api 26)]
minSdkVersionが25以下の場合は、Old SDK VersionsにするかJava8言語機能を利用します。ただし、Java8言語APIのサポートはminSdkVersion:24以上となっている為、23以下の場合は、素直にOld SDK Versionsを利用しましょう。
android { ... compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } }
ハードウェアアクセラレーションを有効にする
マニフェストファイルに android:hardwareAccelerated="true" を追記します。
<application android:hardwareAccelerated="true" ... />
QRコード読み取り用のアクティビティを追記
カメラの起動からプレビュー表示、QRコード読み取りに関する処理は、ライブラリ内のアクティビティを使うので、アクティビティをマニフェストファイルに追記します。
<manifest ...> <application ...> ... <activity android:name="com.journeyapps.barcodescanner.CaptureActivity" android:screenOrientation="fullSensor" tools:replace="screenOrientation" /> </application> </manifest>
実装コード
簡単にオプションを設定してスキャン開始して、結果をToastで出力するだけの簡易的な処理です。
import android.content.Intent import android.widget.Toast import com.google.zxing.integration.android.IntentIntegrator class MainActivity : AppCompatActivity() { private lateinit var qrScanIntegrator: IntentIntegrator override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) this.qrScanIntegrator = IntentIntegrator(this) // 縦画面に固定 this.qrScanIntegrator.setOrientationLocked(false) // QRコード読み取り後のビープ音を停止 this.qrScanIntegrator.setBeepEnabled(false) // スキャン開始 this.qrScanIntegrator.initiateScan() } // 読取後に呼ばれる override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { val result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data) if (result != null) { // 読取結果はresult.contentsで参照できる Toast.makeText(this, result.contents, Toast.LENGTH_LONG).show() } else { super.onActivityResult(requestCode, resultCode, data) } } }
今回は簡単な処理でライブラリの使い方と動作確認をしてみました。次回は取得した結果を別なActivityに渡してコントロールに表示したりしてみようと思います。
Commentsこの記事のコメント
メールアドレスが公開されることはありません。お気軽にコメントどうぞ。