如何在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
相关产品推荐
相关产品推荐

