BiometricManager
には、canAuthenticate
次の 4 つのフラグのいずれかを返すことができるメソッドがあります。
when (biometricManager.canAuthenticate()) {
BiometricManager.BIOMETRIC_SUCCESS ->
Log.d("MY_APP_TAG", "App can authenticate using biometrics.")
BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE ->
Log.e("MY_APP_TAG", "No biometric features available on this device.")
BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE ->
Log.e("MY_APP_TAG", "Biometric features are currently unavailable.")
BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED ->
Log.e("MY_APP_TAG", "The user hasn't associated " +
"any biometric credentials with their account.")
}
BiometricPrompt
ここで、その呼び出しの結果が である場合にのみトリガーしBIOMETRIC_SUCCESS
、それ以外の場合は別の認証方法 (つまり、アプリ固有のパスワード) にフォールバックすることが論理的であるように思われます。
しかしsetDeviceCredentialAllowed(true)
、BiometricPrompt を設定すると、チェックが返されなくてもデバイスのパスワードを使用できます(この場合は が返されると思います)。canAuthenticate
BIOMETRIC_SUCCESS
BIOMETRIC_ERROR_NONE_ENROLLED
KeyguardManager
さらに、ピン/パスワード/パターンが設定されているかどうかを確認するために使用できます。
val kgm = getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager
if (kgm.isDeviceSecure) {
[...]
}
ただし、これは API 23 以降でのみ機能します。ただし、setDeviceCredentialAllowed
23 未満の API レベルで動作します。ただし、これらの古いデバイスにデバイス パスワードが設定されているかどうかを確認する実際の代替手段はないようです。
私の質問は次のとおりです。これらすべての異なるオプションを使用して、適切な認証方法をユーザーに表示する正しいフローは何ですか? 23 未満の API レベルでは、どのようcanAuthenticate
にisDeviceSecure
組み合わせて使用する必要があり、どのチェックを使用する必要がありますか?