用BiometricPrompt检查生物特征和密码的正确流程是什么?

问题描述 投票:0回答: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,否则退回到其他身份验证方法(即应用专用密码),似乎合乎逻辑。

但是如果我在BiometricPrompt上设置setDeviceCredentialAllowed(true),即使canAuthenticate检查未返回BIOMETRIC_SUCCESS,它也可以仍使用设备密码(我认为在这种情况下,它返回BIOMETRIC_ERROR_NONE_ENROLLED)。

我还可以使用KeyguardManager检查是否设置了密码/密码/样式:

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

但是这仅适用于API 23+。但是,setDeviceCredentialAllowed适用于23以下的API级别。但是似乎没有真正的选择来检查是否在这些较旧的设备上设置了设备密码。

所以我的问题是:使用所有这些不同的选项,向用户显示适当的身份验证方法的正确流程是什么? [canAuthenticateisDeviceSecure应该如何一起使用,低于23的API级别应该使用什么检查?

fingerprint biometrics android-fingerprint-api android-biometric-prompt android-biometric
1个回答
0
投票
仅在尝试仅通过生物识别而非其他任何方式进行身份验证时,才应使用canAuthenticate()。在这种情况下,其为well documented recommended approach

如果您的兴趣是setDeviceCredentialAllowed(true),而该功能本身仅适用于API 21+,则根据您的minSdkVersion,您可以有一些实现选项。

API 23 +

if (keyguardManager.isDeviceSecure()){ biometricPrompt.authenticate(promptInfo) }

API 16到API 23之前的版本

if (keyguardManager.isKeyguardSecure) { biometricPrompt.authenticate(promptInfo) }
[KeyguardManager.isKeyguardSecure()等效于isDeviceSecure(),除非设备被SIM锁定。

API 14至API之前的16

如果定位的目标低于API 16或SIM卡锁是一个问题,则回调onAuthenticationError()是最佳选择。
© www.soinside.com 2019 - 2024. All rights reserved.