8、人脸识别与指纹识别共存:BiometricPrompt.Authenticators组合、BIOMETRIC_STRONG与BIOMETRIC_WEAK区别
好,咱们今天聊一个很实际的问题。
手机上有指纹,也有人脸。作为开发者,你该怎么让它们和平共处?
说白了,就是用户既可以用指纹解锁,也可以用脸解锁。甚至在某些场景下,系统会自动帮你选一个最合适的。
嗯,这背后全靠 BiometricPrompt.Authenticators 这个组合器。我刚开始接触这块时,也被各种常量搞晕过。今天咱们把它彻底理清楚。
8.1 为什么需要组合?
你想想看,一台 Android 设备可能同时具备:
- 电容式指纹传感器(硬件级,很安全)
- 红外摄像头人脸识别(也是硬件级,安全性高)
- 普通前置摄像头人脸识别(纯软件,安全性弱)
作为开发者,你不能替用户做决定。用户可能今天手指脱皮了,指纹不好使,想用人脸。也可能戴着口罩,人脸识别不了,想用指纹。
所以,最佳实践是:同时注册多种生物识别方式,让系统弹窗时自动展示所有可用的选项。
核心原则:不要只绑定一种生物识别方式。用 Authenticators 组合,把选择权交给用户和系统。
8.2 BIOMETRIC_STRONG vs BIOMETRIC_WEAK
这是 Android 给生物识别方式打的「安全等级标签」。我直接给你对比表,一目了然:
| 常量 | 安全等级 | 典型硬件 | 是否可被绕过 | 适用场景 |
|---|---|---|---|---|
BIOMETRIC_STRONG |
高(Class 3) | 超声波指纹、3D结构光人脸 | 极难 | 支付、登录、敏感操作 |
BIOMETRIC_WEAK |
低(Class 2) | 普通摄像头人脸识别 | 相对容易(照片可能骗过) | 应用解锁、个性化推荐 |
我记得有一次,一个金融类 App 找我咨询。他们用了 BIOMETRIC_WEAK 做人脸支付,结果被安全团队打回来了。嗯,支付场景必须用 BIOMETRIC_STRONG,这是硬性要求。
警告:如果你的 App 涉及资金交易、敏感数据访问,请务必使用 BIOMETRIC_STRONG。用 WEAK 的话,审核可能过不了,甚至会有法律风险。
8.3 如何组合?代码实战
好,理论说完了,咱们直接上代码。我个人习惯用 Authenticators 的位运算组合:
// 同时支持强生物识别 + 设备锁屏密码(备选)
int authenticators = BiometricManager.Authenticators.BIOMETRIC_STRONG
| BiometricManager.Authenticators.DEVICE_CREDENTIAL;
// 或者:同时支持强指纹 + 弱人脸
int authenticators = BiometricManager.Authenticators.BIOMETRIC_STRONG
| BiometricManager.Authenticators.BIOMETRIC_WEAK;
// 构建 BiometricPrompt
BiometricPrompt.PromptInfo promptInfo = new BiometricPrompt.PromptInfo.Builder()
.setTitle("验证身份")
.setSubtitle("请使用指纹或人脸识别")
.setAllowedAuthenticators(authenticators)
.build();
这里有个细节:DEVICE_CREDENTIAL 指的是 PIN 码、图案或密码。它不算生物识别,但可以作为「兜底方案」。当用户所有生物识别都失败时,可以退回到输入密码。
小技巧:我建议你总是加上 DEVICE_CREDENTIAL。因为有些用户可能没有录入任何生物信息,或者传感器临时故障。有了密码兜底,你的 App 就不会卡死在验证环节。
8.4 组合后的行为逻辑
当你设置了多个 Authenticators,系统会怎么做?
- 弹窗展示:系统会自动检测设备支持的生物识别方式,并在弹窗中显示对应的图标(指纹、人脸、虹膜等)。
- 用户选择:用户可以选择任意一种已注册的方式。比如点一下指纹图标,或者直接看摄像头。
- 回调统一:无论用户用了哪种方式,最终都会回调到同一个
BiometricPrompt.AuthenticationCallback中。你不需要区分是哪种方式成功的。
我曾经在项目中遇到过一个问题:用户同时录入了指纹和人脸,但弹窗只显示了指纹。排查了半天,发现是 BIOMETRIC_WEAK 没加进去。嗯,组合器少写了一个常量,结果人脸选项就没了。
8.5 知识体系图
下面这张图,帮你把整个逻辑串起来:
8.6 避坑指南
最后,分享几个我踩过的坑:
- 不要混用
setDeviceCredentialAllowed(true)和setAllowedAuthenticators():这两个 API 是互斥的。用了后者,前者就失效了。我建议统一用setAllowedAuthenticators(),更灵活。 - 注意 Android 版本差异:
BIOMETRIC_WEAK是从 Android 11(API 30)才开始支持的。如果你的 App 要兼容低版本,记得做版本判断。 - 测试时多换几台设备:不同厂商对生物识别的实现有差异。有的手机人脸是
STRONG,有的只是WEAK。我曾经在一台千元机上测试,人脸识别居然被一张照片骗过了——嗯,那台机器的人脸就是WEAK级别的。
总结一句话:用 Authenticators 组合,让指纹和人脸共存。支付场景用 STRONG,普通场景可以放宽到 WEAK。别忘了加 DEVICE_CREDENTIAL 兜底。