Android生物识别:如何检测生物识别功能已锁定?
问题分析与解决方案
首先明确两个关键错误码的含义:
errorCode 7对应BiometricPrompt.ERROR_LOCKOUT,即生物识别因多次失败被临时锁定;canAuthenticate返回的状态码11对应BiometricManager.BIOMETRIC_ERROR_NO_BIOMETRICS,这是系统在生物识别锁定时的特殊行为——暂时屏蔽已注册的生物特征,导致接口返回"未注册"。
可行的判断方式
直接通过AuthenticationCallback的错误码判断
这是最准确的方式,在onAuthenticationError中捕获锁定相关错误码:override fun onAuthenticationError(errorCode: Int, errString: CharSequence) { super.onAuthenticationError(errorCode, errString) when(errorCode) { BiometricPrompt.ERROR_LOCKOUT -> { // 生物识别临时锁定,一段时间后自动解锁 finishActivity("生物识别已临时锁定", errorCode) } BiometricPrompt.ERROR_LOCKOUT_PERMANENT -> { // 生物识别永久锁定,需通过PIN/图案/密码解锁设备后恢复 finishActivity("生物识别已永久锁定,请解锁设备后重试", errorCode) } else -> { finishActivity(errString.toString(), errorCode) } } }结合历史注册状态辅助判断
由于锁定期间canAuthenticate会返回11,可通过本地存储记录设备是否曾注册过生物特征:- 首次启动App或用户完成生物识别设置时,调用一次
canAuthenticate,若返回BiometricManager.BIOMETRIC_SUCCESS,则在SharedPreferences中标记"已注册生物特征"; - 后续若
canAuthenticate返回11,但本地标记为已注册,且近期有生物识别失败的记录,即可推断是锁定导致的,而非真的未注册。
- 首次启动App或用户完成生物识别设置时,调用一次
补充说明
系统在生物识别锁定时返回11是保护机制,目的是防止恶意程序通过反复调用canAuthenticate探测锁定状态。因此,优先依赖AuthenticationCallback的错误码是最可靠的方案。
内容的提问来源于stack exchange,提问作者Allen Huang
相关产品推荐
相关产品推荐

