本記事ではKotlinで指紋認証を実装する方法を説明します。

環境

こちらの環境で実装しました。

  • Android Studio: Iguana | 2023.2.1 Patch 1
  • 使用デバイス: Pixel 7
  • Androidバージョン: 13

build.gradleの設定

build.gradleにこちらを追加します。

dependencies {
    implementation 'androidx.biometric:biometric:1.2.0-alpha05'
}

AndroidManifest.xmlの設定

manifestタグの直下にこちらを追加します。

<uses-permission android:name="android.permission.USE_BIOMETRIC"/>

生体認証が利用可能かチェック

ますは生体認証が可能かどうかをこちらのコードでチェックします。

// BiometricManagerを取得
val biometricManager: BiometricManager = BiometricManager.from(this)

// 生体認証の利用可能状態をチェック
when (biometricManager.canAuthenticate(0)) {
    // 生体認証が利用可能な場合
    BiometricManager.BIOMETRIC_SUCCESS ->
        Toast.makeText(this@LoginActivity, "生体認証が利用可能です。", Toast.LENGTH_SHORT).show()

    // 生体認証ハードウェアがデバイスに存在しない場合
    BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE ->
        Toast.makeText(this@LoginActivity, "生体認証ハードウェアが存在しません。", Toast.LENGTH_SHORT).show()

    // 生体認証ハードウェアが現在利用できない場合
    BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE ->
        Toast.makeText(this@LoginActivity, "生体認証ハードウェアが現在利用できません。", Toast.LENGTH_SHORT).show()

    // 生体認証が設定されていない場合
    BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED ->
        Toast.makeText(this@LoginActivity, "生体認証が設定されていません。", Toast.LENGTH_SHORT).show()
}

指紋認証のメソッドを実装

次に生体認証を開始し、その結果を処理するコードを書きます。

// 認証をキャンセルするためのCancellationSignalオブジェクトを作成
cancelSignal = CancellationSignal()

// BiometricPromptのBuilderを作成
val builder = BiometricPrompt.Builder(this)

// 生体認証プロンプトのタイトルを設定
builder.setTitle("生体認証します")

// キャンセルボタンを設定
builder.setNegativeButton("キャンセル", mainExecutor, DialogInterface.OnClickListener { dialogInterface, i ->
    // キャンセルシグナルをキャンセル
    cancelSignal.cancel()
})

// BiometricPromptをビルドして認証を開始
builder.build().authenticate(cancelSignal, mainExecutor, object : BiometricPrompt.AuthenticationCallback() {
    // 認証エラー時
    override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
        when (errorCode) {
            // 生体認証が設定されていない場合
            BiometricPrompt.BIOMETRIC_ERROR_NO_BIOMETRICS ->
                Toast.makeText(this@LoginActivity, "生体認証に非対応", Toast.LENGTH_SHORT).show()
            else ->
                // その他のエラー
                Toast.makeText(this@LoginActivity, "その他エラー", Toast.LENGTH_SHORT).show()
        }
    }

    // 認証成功時
    override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
        // 認証成功メッセージを表示
        Toast.makeText(this@LoginActivity, "認証成功", Toast.LENGTH_SHORT).show()
    }

    // 認証失敗時
    override fun onAuthenticationFailed() {
        // 認証失敗メッセージを表示
        Toast.makeText(this@LoginActivity, "認証失敗", Toast.LENGTH_SHORT).show()
    }
})

実際の画面

Android では、セキュリティ上の理由から、生体認証ダイアログをキャプチャすることはできないようです。そのため本ブログでは実際の画面の掲載は控えさせていただきます。

まとめ

実装方法
  1. build.gradleとAndroidManifest.xmlの設定を行います。
  2. 生体認証が利用可能かチェックするコードを書きます。
  3. 認証メソッドを実装します。
考慮すべき点
  1. デバイス依存:
    指紋認証は対応デバイスでのみ利用可能です。非対応デバイスでは対応できません。
  2. 認証失敗時の処理:
    認証が失敗した場合のエラー表示やパスコード入力などの代替手段を提供が必要です。

参考文献

https://source.android.com/docs/security/features/biometric?hl=ja
https://source.android.com/docs/security/features/authentication/fingerprint-hal?hl=ja