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 知识体系图

下面这张图,帮你把整个逻辑串起来:

人脸识别与指纹识别共存逻辑 BiometricPrompt Authenticators 组合 BIOMETRIC_STRONG | BIOMETRIC_WEAK 安全等级区分 STRONG(支付) vs WEAK(解锁) 系统自动检测设备支持的生物识别方式 弹窗展示所有可用选项,用户自由选择

8.6 避坑指南

最后,分享几个我踩过的坑:

  • 不要混用 setDeviceCredentialAllowed(true)setAllowedAuthenticators()这两个 API 是互斥的。用了后者,前者就失效了。我建议统一用 setAllowedAuthenticators(),更灵活。
  • 注意 Android 版本差异:BIOMETRIC_WEAK 是从 Android 11(API 30)才开始支持的。如果你的 App 要兼容低版本,记得做版本判断。
  • 测试时多换几台设备:不同厂商对生物识别的实现有差异。有的手机人脸是 STRONG,有的只是 WEAK。我曾经在一台千元机上测试,人脸识别居然被一张照片骗过了——嗯,那台机器的人脸就是 WEAK 级别的。

总结一句话:Authenticators 组合,让指纹和人脸共存。支付场景用 STRONG,普通场景可以放宽到 WEAK。别忘了加 DEVICE_CREDENTIAL 兜底。


公众号:蓝海资料掘金营,微信deep3321