1

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 を設定すると、チェックが返されなくてもデバイスのパスワードを使用できます(この場合は が返されると思います)。canAuthenticateBIOMETRIC_SUCCESSBIOMETRIC_ERROR_NONE_ENROLLED

KeyguardManagerさらに、ピン/パスワード/パターンが設定されているかどうかを確認するために使用できます。

val kgm = getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager
if (kgm.isDeviceSecure) {
    [...]
}

ただし、これは API 23 以降でのみ機能します。ただし、setDeviceCredentialAllowed23 未満の API レベルで動作します。ただし、これらの古いデバイスにデバイス パスワードが設定されているかどうかを確認する実際の代替手段はないようです。

私の質問は次のとおりです。これらすべての異なるオプションを使用して、適切な認証方法をユーザーに表示する正しいフローは何ですか? 23 未満の API レベルでは、どのようcanAuthenticateisDeviceSecure組み合わせて使用​​する必要があり、どのチェックを使用する必要がありますか?

4

1 に答える 1