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用来检查是否设置了 pin/password/pattern:

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

但这仅适用于 API 23+。但是,setDeviceCredentialAllowed适用于低于 23 的 API 级别。但似乎没有真正的替代方法可以检查这些旧设备上是否设置了设备密码

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

4

1 回答 1

2

canAuthenticate()仅当您尝试仅使用生物特征进行身份验证时才应使用,而不是其他任何东西。在这种情况下,这是一个有据可查的推荐方法

如果您感兴趣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()是您最好的选择。

于 2020-01-07T21:35:45.477 回答