Kotlin中BiometricManager对象创建及生物识别硬件与注册状态检查问题
嘿,我来帮你捋清楚这些生物识别认证的前置检查问题,咱们一步步来解决:
关于BiometricManager与生物识别前置检查的解决方案
首先,解决你无法创建BiometricManager对象的问题
BiometricManager是Android 10(API 29)才引入的,而且不能直接通过构造函数创建实例,得用静态方法BiometricManager.from(context)来获取它的实例,这是你踩的第一个小坑~
其次,调用BiometricManager#canAuthenticate做前置检查
这个方法是用来统一判断生物识别是否可用的核心方法,它会返回不同的常量值,咱们可以根据返回值分别判断硬件是否存在、是否已注册生物信息:
先看返回值对应的含义:
BiometricManager.BIOMETRIC_SUCCESS:一切正常,硬件可用且已注册生物识别信息BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE:设备根本没有生物识别硬件BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE:硬件存在但当前不可用(比如传感器被占用)BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED:硬件可用,但用户没注册任何生物识别信息(比如指纹、面部)
把检查逻辑整合到你的现有代码里
下面是修改后的完整Kotlin代码示例,在调用biometricPrompt.authenticate()之前先做检查,避免直接调用出现不必要的错误:
// 先获取BiometricManager实例 val biometricManager = BiometricManager.from(this) // 调用canAuthenticate做检查,指定允许的生物识别类型 when (biometricManager.canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_WEAK or BiometricManager.Authenticators.BIOMETRIC_STRONG)) { BiometricManager.BIOMETRIC_SUCCESS -> { // 硬件可用且已注册生物信息,正常显示生物识别弹窗 val executor = Executors.newSingleThreadExecutor() val biometricPrompt = BiometricPrompt(this, executor, object : BiometricPrompt.AuthenticationCallback() { override fun onAuthenticationError(errorCode: Int, errString: CharSequence) { super.onAuthenticationError(errorCode, errString) Log.d("BIOMETRIC", "$errString $errorCode") val isAvailable = errorCode != BiometricPrompt.ERROR_HW_NOT_PRESENT && errorCode != BiometricPrompt.ERROR_NO_BIOMETRICS PreferenceHandler.setBiometricAvailable(this@LockActivity, isAvailable) } override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) { super.onAuthenticationSucceeded(result) // 认证成功后的逻辑,比如解锁界面 } override fun onAuthenticationFailed() { super.onAuthenticationFailed() Log.d("BIOMETRIC", "FAILED") } }) val promptInfo = BiometricPrompt.PromptInfo.Builder() .setTitle("App title") .setSubtitle("") .setDescription("Identify yourself by Biometrics") .setNegativeButtonText("Use Password") .build() biometricPrompt.authenticate(promptInfo) } BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE -> { // 没有生物识别硬件,直接设置不可用 PreferenceHandler.setBiometricAvailable(this, false) Log.d("BIOMETRIC", "No biometric hardware found") // 这里可以引导用户用密码登录 } BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE -> { // 硬件暂时不可用,提示用户稍后再试 Log.d("BIOMETRIC", "Biometric hardware is currently unavailable") } BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED -> { // 硬件可用但没注册,引导用户去系统设置注册 Log.d("BIOMETRIC", "No biometrics enrolled, please register in system settings") // 可选:跳转到系统注册页面 // val intent = Intent(Settings.ACTION_BIOMETRIC_ENROLL).apply { // putExtra(Settings.EXTRA_BIOMETRIC_AUTHENTICATORS_ALLOWED, BiometricManager.Authenticators.BIOMETRIC_WEAK or BiometricManager.Authenticators.BIOMETRIC_STRONG) // } // startActivity(intent) } }
额外注意点
- 如果你的App需要兼容API 29以下的设备,BiometricManager就用不了,这时候可以直接保留你原来的逻辑:调用BiometricPrompt的authenticate,然后在
onAuthenticationError里处理ERROR_HW_NOT_PRESENT和ERROR_NO_BIOMETRICS这些错误码。 canAuthenticate的参数可以指定允许的生物识别强度,比如BIOMETRIC_WEAK(指纹)或者BIOMETRIC_STRONG(面部、虹膜),根据你的需求组合即可。
内容的提问来源于stack exchange,提问作者AvisSiva
相关产品推荐
相关产品推荐

