【Android】BiometricPromptを使って生体認証を簡単に実装してみる

本投稿は TECOTEC Advent Calendar 2020 の19日目の記事です。

投資戦略システム事業部のAndroidエンジニア、佐野(柴犬)です! 4年連続で19日目の記事を担当することとなりました。

過去のブログとQiitaの記事は以下からぜひ!

ブログ【Android】Retrofit2を使ったAPI通信について

Qiita 2019年【MaterialComponentsを使ったお手軽マテリアルデザイン】

Qiita 2018年【Androidでカスタムボタンを作成する方法】

Qiita 2017年【Android端末の言語設定毎に読み込む言語ファイルを変更する方法】

今回はAndroidxのBiometricPromptを使用して、生体認証の仕組みをサクッと作ってみたいと思います。

はじめに

そもそも生体認証とは、指紋・静脈・声・虹彩・顔などの身体の一部を使用して本人かどうかを特定する仕組みです。 スマートフォンでは指紋・顔認証がメインとなります。

少し前まではFingerprintManagerを使用していましたが、API28からdeprecatedされています。

その代わりに登場したのが、上記の機能を拡張して作られたBiometricPromptです。

使い方

まずはapp/build.gradleを開き、dependenciesに以下を追加します。

追加が終わったらSync Nowします。

dependencies {
    // TODO:2020/12/19時点の最新の安定版は'1.0.1'
    implementation 'androidx.biometric:biometric:1.0.1'
}

お次はAndroidManifest.xmlにパーミッション(権限)の追加を行ないます。

manifestタグ直下に以下を追加してください。

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

まず、生体認証を使えるかどうかのチェックを行ないましょう。

BiometricManagerのcanAuthenticate()でチェックすることができます。 使い方は以下の通りです。

// 生体認証が使えるかどうかチェックする
when (BiometricManager.from(context).canAuthenticate()) {
    /** 生体認証が使用可能 */
    BiometricManager.BIOMETRIC_SUCCESS -> { }

    /** 指紋や顔などの生体情報が未登録 */
    BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED -> { }

    /** 生体認証に対応していない端末 */
    BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE,
    BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE -> { }
}

戻り値はInt型のステータスです。

成功している場合のみ以下を実施することとなります。

val exeutor = Executors.newSingleThreadExecutor()

// 認証時、結果を受け取るためのコールバック
val biometricPrompt = BiometricPrompt(context, exeutor, object : BiometricPrompt.AuthenticationCallback() {
    /** 認証成功 */
    override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
        super.onAuthenticationSucceeded(result)
    }

    /** 認証失敗 */
    override fun onAuthenticationFailed() {
        super.onAuthenticationFailed()
    }

    /** エラー(errorCodeとerrStringで対応方法を変える) */
    override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
        super.onAuthenticationError(errorCode, errString)
    }
})

// ダイアログに表示する文言周りの設定
val promptInfo = BiometricPrompt.PromptInfo.Builder()
    .setTitle("タイトル")
    .setSubtitle("サブタイトル")
    .setDescription("説明")
    .setNegativeButtonText("キャンセル")
    .build()

// 生体認証を開始
biometricPrompt.authenticate(promptInfo)

基本的にはこれだけです。

端末のOSバージョンにもよりますが、だいたいこういった画面が表示される形になります。

Screenshot_1607929250.png

いつ認証を行ない、認証成功・失敗時にどういう動きをさせるかが重要になってきます。

おわりに

いかがでしたでしょうか?

かなり簡単に生体認証を実装できるBiometricPrompt、ぜひ試してみてください!

www.tecotec.co.jp