はじめに
Androidアプリでは、よりセキュアにするために生体認証を使うケースが存在します。
現在、AndroidXライブラリを用いた生体認証のダイアログは、ユースケースに応じて2種類設定できます。
- 生体認証ができない場合に、「PIN/password/パターン」といった画面ロック設定で代替可能とするダイアログ
- 生体認証を行うか、キャンセルのいずれかを行うダイアログ(画面ロックは代替手段として使えない)
今回は、生体認証・画面ロックのいずれかで認証を可能とする際の書き方についてです。
生体認証と画面ロックいずれかを必須とする設定
まず、Android10以下と11以上で以下のように設定を分ける必要があります。
val biometricPrompt = BiometricPrompt(this, executor, authCallBack)
val promptInfo =
//OS11以上
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
BiometricPrompt.PromptInfo.Builder()
.setTitle(getString(R.string.biometric_title))
.setAllowedAuthenticators(BiometricManager.Authenticators.BIOMETRIC_STRONG or BiometricManager.Authenticators.DEVICE_CREDENTIAL)
.build()
} else { //OS10以下
BiometricPrompt.PromptInfo.Builder()
.setTitle(getString(R.string.biometric_title))
.setDeviceCredentialAllowed(true)
.build()
}
biometricPrompt.authenticate(promptInfo)
各種エラーをハンドリングする
アプリで生体認証やロック解除を使いたい場合、逆に言えば「生体認証やロック解除の設定がされていないアプリでは、使ってほしくない」ということになります。
では、どちらも設定されていない場合、適切に弾いてあげましょう。
今回はこのようにしました。
override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
// 認証エラー
super.onAuthenticationError(errorCode, errString)
when (errorCode) {
// PINと指紋を両方設定していない場合、この3つを通る可能性がある
BiometricPrompt.ERROR_NO_DEVICE_CREDENTIAL,
BiometricPrompt.ERROR_NO_BIOMETRICS,
BiometricPrompt.ERROR_HW_NOT_PRESENT -> {
//設定されてないときの処理
}
//ユーザーが明示的にキャンセルを押した時
BiometricPrompt.ERROR_USER_CANCELED -> {
//再度認証を求める、アプリの操作を続行できなくするなど
}
}
}
以下のようなエラーも存在はしますが、今回は通らない想定のため省いています。
BiometricPrompt.ERROR_HW_UNAVAILABLE
これは何らかの理由で、生体センサーが無効になっている時のエラーです。
今回の仕様では「生体センサーが無効でも画面ロックの設定さえあればそちらが起動する」となっているため、特に気にしなくて良いと判断しました。
本当はスクショを見せたいんですが、OSによりスクリーンショットを塞がれていました。。。
これで生体認証もしくは画面ロック解除のいずれかを要求することができます。
引用
生体認証ダイアログを表示する(https://developer.android.com/training/sign-in/biometric-auth?hl=ja)