Android生物识别Biometric_Not_Enrolled真机异常模拟器正常问题
问题根因
你调用BiometricManager.canAuthenticate()时传入的验证类型是BiometricManager.Authenticators.BIOMETRIC_STRONG or BiometricManager.Authenticators.DEVICE_CREDENTIAL,意味着只要设备支持「强生物识别」或者「设备密码/图案/PIN验证」两者任意一种已配置,就会返回BIOMETRIC_SUCCESS。
Galaxy A7 2017设备虽然删除了所有生物识别信息,但只要你设置了锁屏密码、图案这类设备凭证,就会触发这个返回逻辑,和你预期的「仅判断生物识别是否录入」的逻辑不符。
解决方案
方案1:仅启用纯生物识别验证(不需要 fallback 到设备密码)
直接把canAuthenticate的入参里的DEVICE_CREDENTIAL移除,仅保留生物识别相关的验证类型即可,修改后的判断代码如下:
// 原来的写法 // when (biometricManager.canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_STRONG or BiometricManager.Authenticators.DEVICE_CREDENTIAL)) { // 修改后的写法,仅判断强生物识别的状态 when (biometricManager.canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_STRONG)) { // 剩余分支逻辑不变 }
修改后只要设备未录入任何生物识别信息,就会正确返回BIOMETRIC_ERROR_NONE_ENROLLED。
方案2:保留设备凭证 fallback,同时单独判断生物识别录入状态
如果你的业务确实需要同时支持生物识别和设备密码验证,只需要额外增加一层生物识别状态的单独判断即可:
val biometricManager = BiometricManager.from(context) // 先单独判断生物识别的录入状态 val onlyBiometricStatus = biometricManager.canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_STRONG) if (onlyBiometricStatus == BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED) { // 此处执行未录入生物特征的业务逻辑,比如引导用户录入指纹 canUseBiometricErrorNoneEnrolled.invoke() return@let } // 再走原来的混合验证逻辑 when (biometricManager.canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_STRONG or BiometricManager.Authenticators.DEVICE_CREDENTIAL)) { // 原有分支逻辑不变 }
机型适配注意
Galaxy A7 2017搭载的是 Android 8.0 及以上系统,属于较早适配生物识别框架的机型,部分系统版本的Biometric库检测逻辑会优先响应设备凭证状态,单独拆分生物识别和设备凭证的判断逻辑可以规避大部分这类兼容问题。
内容的提问来源于stack exchange,提问作者Marco Antonio Martiniano
相关产品推荐
相关产品推荐

