如何在不唤起授权弹窗的前提下检查生物识别传感器的状态
解决方案说明
目前Android原生公开的Biometric API确实没有提供直接在唤起验证前检查传感器锁定状态的接口,你可以根据你的应用场景选择以下两种可行方案:
- 方案1:利用绑定生物认证的KeyStore密钥间接判断(适用普通三方应用,兼容API 23+)
你可以提前生成一个绑定生物认证的对称/非对称密钥,设置setUserAuthenticationRequired(true),需要检查锁定状态时,尝试初始化该密钥对应的Cipher/Mac/Signature实例,如果初始化抛出KeyPermanentlyInvalidatedException或者相关异常,结合业务逻辑即可间接判断传感器是否处于锁定状态。示例代码片段如下:
try { KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); keyStore.load(null); SecretKey secretKey = (SecretKey) keyStore.getKey("your_biometric_bound_key", null); Cipher cipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/" + KeyProperties.BLOCK_MODE_CBC + "/" + KeyProperties.ENCRYPTION_PADDING_PKCS7); cipher.init(Cipher.ENCRYPT_MODE, secretKey); // 初始化成功,传感器未锁定,可正常唤起验证 } catch (KeyPermanentlyInvalidatedException e) { // 密钥失效,大概率是生物传感器锁定或者用户录入信息变更,可判定为当前不可用 } catch (InvalidKeyException e) { // 同样处理为生物识别当前不可用 } catch (Exception e) { // 其他异常按需处理 }
该方案的缺点是需要提前生成绑定密钥,仅能覆盖需要密钥加密的生物认证场景。
- 方案2:遵循官方推荐逻辑,在认证回调中处理锁定错误
这是Google官方最推荐的兼容方案,本身临时锁定ERROR_LOCKOUT的持续时间通常只有30秒,永久锁定ERROR_LOCKOUT_PERMANENT也只有用户输入设备PIN/图案密码才能解锁,提前检查的业务收益极低。你可以直接调用biometricPrompt.authenticate(...),在AuthenticationCallback的onAuthenticationError回调中判断错误码,给用户对应的提示即可:
new BiometricPrompt.AuthenticationCallback() { @Override public void onAuthenticationError(int errorCode, @NonNull CharSequence errString) { super.onAuthenticationError(errorCode, errString); if (errorCode == BiometricPrompt.ERROR_LOCKOUT) { // 临时锁定,提示用户30秒后重试 } else if (errorCode == BiometricPrompt.ERROR_LOCKOUT_PERMANENT) { // 永久锁定,提示用户输入设备密码解锁生物传感器 } } }
该方案兼容性最好,适配所有支持BiometricPrompt的系统版本,实现成本最低。
注意:Android系统隐藏API中存在hasLockout()相关的内部方法,但这些方法不属于公开SDK范围,普通三方应用无法调用,强行反射调用会在高版本系统中被拦截,存在兼容性风险,不推荐使用。
内容的提问来源于stack exchange,提问作者Re Senpai
相关产品推荐
相关产品推荐

