3

BiometricPrompt.PromptInfo'方法的文档setDeviceCredentialAllowed说明:

[...] 在启用此功能之前,开发人员应首先检查 KeyguardManager.isDeviceSecure()。如果设备不安全,BiometricPrompt.ERROR_NO_DEVICE_CREDENTIAL 将在 BiometricPrompt.AuthenticationCallback.onAuthenticationError(int, CharSequence) 中返回。

https://developer.android.com/reference/androidx/biometric/BiometricPrompt.PromptInfo.Builder.html#setDeviceCredentialAllowed(boolean)

但是,为了首先启用生物识别身份验证,您必须设置设备 PIN 或密码。当我们已经拥有时,这个检查(仅在 API 23+ 上可用)不是多余的BiometricManager.canAuthenticate吗?

4

1 回答 1

3

这是一个很好的问题!提供逐步响应可能很重要。首先,让我们将特定设备上发生的事情与您的应用程序中发生的事情分开。然后我们将解决更具体的问题。

设备

运行 API 23+ 的设备可能有也可能没有设备登录凭据设置。设备所有者无需设置设备 PIN、图案、密码或生物识别模板。这是一个选择。

应用程序

无论是否设置了设备登录凭据,用户都应该能够安装您的应用程序。因此,您的应用程序必须以处理未设置登录凭据的用例的方式编写。

回答您更具体的问题

建议您在实现生物识别 API 时传入一个CryptoObjectto 。authenticate()如果您遵循该建议,那么是的,您将canAuthenticate()在致电之前进行检查authenticate(promptInfo, cryptoObject)。造成这种情况的原因有很多,您可以通过阅读上面提到的博客文章来了解这些原因。

由于您的问题是专门关于setDeviceCredentialAllowed(true)的,因此重要的是要记住是什么canAuthenticate()。它检查三件事:设备上是否有可用的生物识别硬件,用户是否注册了模板,或者用户是否启用了生物识别身份验证。

因此,您不能canAuthenticate()在您的情况下使用它,因为它专门用于生物识别,而setDeviceCredentialAllowed(true)接受设备 PIN、图案或密码。

请注意,虽然建议您使用CryptoObjectsetDeviceCredentialAllowed()但不兼容CryptoObject也不兼容setNegativeButtonText()

PS 你也可以从阅读这篇博文中受益。

于 2020-01-02T21:20:21.060 回答