[Android+zxing]QRコードリーダーアプリを作る

[Android+zxing]QRコードリーダーアプリを作る

はじめに

スマートフォンアプリの開発をやってみたいと思い、手始めにQRコードレーダーを作ってみました。まずはGoogleが提供しているZXingライブラリを使ってみようと思います。

この記事では、カメラやプレビューの処理はライブラリ内のアクティビティを使用している為、複雑な処理はなく実装できます。

開発環境

  • Windows 10 64bit
  • Android Studio 4.0
  • zxing 4.1.0
  • Kotlin

実行結果

この記事の内容を実行するとカメラが起動しQRコードを読み込みできます。
こちらの画像は、デバッグ実行した結果です。

コーディング

実際にコーディングしていきます。

Gradleファイルを編集

build.gradle(Module: app)
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を利用しましょう。

build.gradle(Module: app)
android {
    ...
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

ハードウェアアクセラレーションを有効にする

マニフェストファイルに android:hardwareAccelerated="true" を追記します。

AndroidManifest.xml
<application
    android:hardwareAccelerated="true"
    ...
/>

QRコード読み取り用のアクティビティを追記

カメラの起動からプレビュー表示、QRコード読み取りに関する処理は、ライブラリ内のアクティビティを使うので、アクティビティをマニフェストファイルに追記します。

AndroidManifest.xml
<manifest ...>
    <application ...>
        ...
        <activity android:name="com.journeyapps.barcodescanner.CaptureActivity"
            android:screenOrientation="fullSensor"
            tools:replace="screenOrientation" />
    </application>
</manifest>

実装コード

簡単にオプションを設定してスキャン開始して、結果をToastで出力するだけの簡易的な処理です。

MainActivity.kt
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この記事のコメント

メールアドレスが公開されることはありません。お気軽にコメントどうぞ。

人気記事