Android开发使用BiometricPrompt如何限制仅支持指纹认证
解决方案
你当前代码使用了已废弃的setDeviceCredentialAllowed(true)配置,该配置会默认允许所有系统支持的生物认证方式(指纹、面容等)和设备密码/PIN认证,所以会同时出现多种认证选项。按照以下步骤修改即可限制为仅指纹认证:
修改步骤
- 首先导入所需的认证常量类
import androidx.biometric.BiometricManager import androidx.biometric.BiometricManager.Authenticators.BIOMETRIC_STRONG
- 新增指纹可用性校验逻辑,在调起认证前先判断设备是否存在已录入的可用指纹,避免无指纹设备出现异常
val biometricManager = BiometricManager.from(this) val canAuthenticate = biometricManager.canAuthenticate(BIOMETRIC_STRONG) if (canAuthenticate != BiometricManager.BIOMETRIC_SUCCESS) { authbtn.isEnabled = false Toast.makeText(this, "设备未录入指纹或不支持指纹认证", Toast.LENGTH_SHORT).show() }
- 修改PromptInfo构造逻辑,删除废弃的
setDeviceCredentialAllowed方法,指定仅允许强生物认证,同时添加必填的负按钮配置
val promptInfo=BiometricPrompt.PromptInfo.Builder() .setTitle("指纹认证") .setSubtitle("请验证指纹登录") .setAllowedAuthenticators(BIOMETRIC_STRONG) .setNegativeButtonText("取消") .build()
完整修改后的代码
package com.example.fingerprintauth import android.content.Intent import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import androidx.biometric.BiometricPrompt import androidx.biometric.BiometricManager import androidx.biometric.BiometricManager.Authenticators.BIOMETRIC_STRONG import android.widget.Button import android.widget.Toast import androidx.core.content.ContextCompat import java.util.concurrent.Executor class MainActivity : AppCompatActivity() { private lateinit var executor: Executor private lateinit var biometricPrompt: BiometricPrompt private lateinit var promptInfo: BiometricPrompt.PromptInfo override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) executor = ContextCompat.getMainExecutor(this) // 校验指纹可用性 val biometricManager = BiometricManager.from(this) val canAuthenticate = biometricManager.canAuthenticate(BIOMETRIC_STRONG) val authbtn = findViewById<Button>(R.id.authbtn) if (canAuthenticate != BiometricManager.BIOMETRIC_SUCCESS) { authbtn.isEnabled = false Toast.makeText(this@MainActivity,"设备未录入指纹或不支持指纹认证",Toast.LENGTH_SHORT).show() return } biometricPrompt = BiometricPrompt(this@MainActivity, executor, object:BiometricPrompt.AuthenticationCallback(){ override fun onAuthenticationError(errorCode: Int, errString: CharSequence) { super.onAuthenticationError(errorCode, errString) Toast.makeText(this@MainActivity,"认证错误: $errString",Toast.LENGTH_SHORT).show() } override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) { super.onAuthenticationSucceeded(result) Toast.makeText(this@MainActivity,"认证成功",Toast.LENGTH_SHORT).show() startActivity(Intent(this@MainActivity, Home::class.java)) } override fun onAuthenticationFailed() { super.onAuthenticationFailed() Toast.makeText(this@MainActivity,"认证失败",Toast.LENGTH_SHORT).show() } }) promptInfo = BiometricPrompt.PromptInfo.Builder() .setTitle("指纹认证") .setSubtitle("请验证指纹登录应用") .setAllowedAuthenticators(BIOMETRIC_STRONG) .setNegativeButtonText("取消") .build() authbtn.setOnClickListener { biometricPrompt.authenticate(promptInfo) } } }
特殊情况说明
部分厂商的系统实现会将面容识别也归类为强生物认证(BIOMETRIC_STRONG级别),如果你修改后仍出现面容选项,说明你的设备系统属于此类情况。此时如果要强制仅使用指纹,只能使用已废弃的FingerprintManager API自定义认证弹窗,但该方案在Android 9及以上系统可能存在兼容性问题,不推荐使用。
内容的提问来源于stack exchange,提问作者Saad Mehmood
相关产品推荐
相关产品推荐

