【发布时间】:2020-04-22 21:32:05
【问题描述】:
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.")
}
现在,如果该调用的结果是 BIOMETRIC_SUCCESS,则仅触发 BiometricPrompt 似乎是合乎逻辑的,否则回退到不同的身份验证方法(即应用专用密码)。
但如果我在 BiometricPrompt 上设置了setDeviceCredentialAllowed(true),即使canAuthenticate 检查没有返回BIOMETRIC_SUCCESS,它仍然可以使用设备密码(我认为在这种情况下它会返回@ 987654329@)。
我还可以使用KeyguardManager 来检查是否设置了密码/密码/模式:
val kgm = getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager
if (kgm.isDeviceSecure) {
[...]
}
但这仅适用于 API 23+。但是,setDeviceCredentialAllowed 适用于低于 23 的 API 级别。但似乎没有真正的替代方法可以检查这些旧设备上是否设置了设备密码
所以我的问题是:对于所有这些不同的选项,向用户展示适当的身份验证方法的正确流程是什么? canAuthenticate和isDeviceSecure应该如何搭配使用,API级别低于23应该使用什么检查?
【问题讨论】:
标签: fingerprint biometrics android-fingerprint-api android-biometric-prompt android-biometric