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

如何在Kotlin Android应用中实现仅人脸生物识别认证?

仅人脸识别验证的实现方案(Kotlin + Android)

针对你需要排除指纹、PIN/密码,仅用人脸识别的需求,以下是两种可行的实现路径:

一、基于androidx.biometric库的变通方案

这个方案需要先做前置校验,确保设备仅支持/录入了人脸识别,再配置BiometricPrompt禁用备用验证方式:

1. 前置校验逻辑

在启动验证前,需要确认三个条件:

  • 设备有人脸识别硬件
  • 用户已录入人脸
  • 设备没有录入指纹(避免用户选择指纹验证)

代码示例:

val biometricManager = BiometricManager.from(context)
val packageManager = context.packageManager
val fingerprintManager = FingerprintManagerCompat.from(context)

// 检查人脸硬件支持
val hasFaceHardware = packageManager.hasSystemFeature(PackageManager.FEATURE_FACE)
// 检查人脸已录入(BIOMETRIC_STRONG对应符合安全标准的人脸识别)
val isFaceEnrolled = biometricManager.canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_STRONG) == BiometricManager.BIOMETRIC_SUCCESS
// 检查无指纹录入(避免多生物识别设备用户选指纹)
val noFingerprintsEnrolled = fingerprintManager.getEnrolledFingerprints().isEmpty()

if (!hasFaceHardware || !isFaceEnrolled || !noFingerprintsEnrolled) {
    Toast.makeText(context, "设备不支持仅人脸验证,请检查设置", Toast.LENGTH_SHORT).show()
    return
}

2. 配置BiometricPrompt禁用备用验证

构建PromptInfo时,仅指定BIOMETRIC_STRONG作为允许的验证方式,不要调用setNegativeButtonText,这样生物识别失败时不会触发PIN/密码备用选项:

val executor = ContextCompat.getMainExecutor(context)
val biometricPrompt = BiometricPrompt(
    activity,
    executor,
    object : BiometricPrompt.AuthenticationCallback() {
        override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
            super.onAuthenticationSucceeded(result)
            // 人脸验证成功,执行后续逻辑
        }

        override fun onAuthenticationFailed() {
            super.onAuthenticationFailed()
            // 验证失败,提示用户重试
        }

        override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
            super.onAuthenticationError(errorCode, errString)
            // 处理验证错误(比如用户取消、硬件故障)
        }
    }
)

val promptInfo = BiometricPrompt.PromptInfo.Builder()
    .setTitle("人脸验证")
    .setDescription("请对准摄像头完成人脸识别")
    .setAllowedAuthenticators(BiometricManager.Authenticators.BIOMETRIC_STRONG)
    // 不设置负按钮,禁用PIN/密码备用验证
    .build()

biometricPrompt.authenticate(promptInfo)

注意事项

  • 如果设备同时支持指纹和人脸,上述方案无法强制系统只显示人脸选项,只能通过前置校验拦截这类设备(提示用户无法使用该功能)
  • Android 14及以上版本,可以直接用BiometricManager的新API精准校验仅人脸可用性:
// Android 14+ 专属
val canUseFaceOnly = biometricManager.canAuthenticate(
    BiometricManager.Authenticators.BIOMETRIC_STRONG,
    BiometricManager.BIOMETRIC_TYPE_FACE
) == BiometricManager.BIOMETRIC_SUCCESS

二、替代方案(针对多生物识别设备的强制需求)

如果必须在支持多生物识别的设备上仅用人脸,可以考虑使用设备厂商的专属API:

  • 三星:Samsung Pass API,支持单独触发人脸识别
  • 小米:MIUI人脸识别API
    这类方案兼容性有限,仅适用于特定品牌设备,需要额外做品牌适配。

内容的提问来源于stack exchange,提问作者codophile

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 12:35:31