[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级别。但是似乎没有真正的选择来检查是否在这些较旧的设备上设置了设备密码。
所以我的问题是:使用所有这些不同的选项,向用户显示适当的身份验证方法的正确流程是什么? [canAuthenticate
和isDeviceSecure
应该如何一起使用,低于23的API级别应该使用什么检查?
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)
}
[如果定位的目标低于API 16或SIM卡锁是一个问题,则回调KeyguardManager.isKeyguardSecure()
等效于isDeviceSecure()
,除非设备被SIM锁定。API 14至API之前的16
onAuthenticationError()
是最佳选择。