You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 23:15:03