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
用来检查是否设置了 pin/password/pattern:
val kgm = getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager
if (kgm.isDeviceSecure) {
[...]
}
但这仅适用于 API 23+。但是,setDeviceCredentialAllowed
适用于低于 23 的 API 级别。但似乎没有真正的替代方法可以检查这些旧设备上是否设置了设备密码
所以我的问题是:使用所有这些不同的选项,向用户展示适当的身份验证方法的正确流程是什么?应该如何canAuthenticate
和isDeviceSecure
一起使用,对于低于 23 的 API 级别应该使用什么检查?