10、Android 9 (API 28) 适配:BiometricPrompt在Android 9上的特性、与FingerprintManager的对比
好,咱们今天聊聊 Android 9 上的生物识别适配。说实话,这个版本挺关键的。它是个分水岭——Google 终于把指纹、人脸、虹膜这些乱七八糟的认证方式,统一到了一个 API 里。
我记得刚接触 BiometricPrompt 时,心里还嘀咕:这不就是给 FingerprintManager 套了个壳吗?后来踩了几个坑才发现,事情没那么简单。
10.1 Android 9 上的 BiometricPrompt 长什么样?
Android 9(API 28)是 BiometricPrompt 的第一个正式版本。它不像后来的 Android 10 那么完善,但已经能解决 80% 的需求了。
核心特性我列一下:
- 统一的认证入口:不管是指纹、虹膜还是人脸,都用同一个对话框
- 系统级 UI:认证弹窗由系统绘制,开发者不能自定义布局
- 支持多种生物识别方式:但具体支持哪些,取决于设备硬件
- 回调机制:认证成功、失败、错误都有对应的回调
说白了,Google 想让你少操心。你只需要告诉系统“我要认证”,剩下的交给它。
10.2 和 FingerprintManager 的对比
我刚开始做项目时,项目里全是 FingerprintManager 的代码。后来要适配虹膜,才发现这玩意儿根本没法用。为什么?因为它只认指纹。
咱们直接看对比表:
| 对比项 | FingerprintManager | BiometricPrompt (Android 9) |
|---|---|---|
| 支持的认证方式 | 仅指纹 | 指纹、虹膜、人脸(取决于硬件) |
| UI 控制 | 需要自己实现弹窗 | 系统提供标准弹窗 |
| API 复杂度 | 较低,但功能有限 | 稍高,但更灵活 |
| 安全性 | 依赖指纹硬件 | 支持更强的安全级别 |
| 兼容性 | API 23+ | API 28+ |
| 错误处理 | 需要自己解析错误码 | 提供更清晰的错误回调 |
你看,FingerprintManager 就像一把只能开一种锁的钥匙。而 BiometricPrompt 是一把万能钥匙——前提是你的设备支持。
10.3 代码示例:用 BiometricPrompt 实现虹膜认证
嗯,这里要注意。Android 9 上的 BiometricPrompt 构造函数和后续版本不太一样。我直接贴代码:
// 创建 BiometricPrompt 实例
BiometricPrompt biometricPrompt = new BiometricPrompt.Builder(context)
.setTitle("虹膜认证")
.setSubtitle("请看向屏幕")
.setDescription("将眼睛对准传感器")
.setNegativeButton("取消", mainExecutor, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 用户点击取消
}
})
.build();
// 执行认证
biometricPrompt.authenticate(
new BiometricPrompt.CryptoObject(cipher),
mainExecutor,
new BiometricPrompt.AuthenticationCallback() {
@Override
public void onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result) {
// 认证成功
}
@Override
public void onAuthenticationFailed() {
// 认证失败(非致命)
}
@Override
public void onAuthenticationError(int errorCode, CharSequence errString) {
// 认证错误(致命)
}
}
);
我个人习惯把 CryptoObject 的创建单独抽出来。为什么?因为一旦加密对象创建失败,整个认证流程就断了。我曾经在项目里遇到过 CryptoObject 初始化异常,结果弹窗死活不出来,排查了半天才发现是密钥被删了。
10.4 避坑指南
这里有几个坑,我一个个说:
Android 9 的 BiometricPrompt 不会告诉你具体支持哪种方式。你得自己用 PackageManager 去查。我建议先检查是否有虹膜硬件,再决定是否显示虹膜认证选项。
你想想看,如果你非要改弹窗样式,那只能自己实现一套认证流程。但我不建议这么做——系统弹窗的安全性更高,用户也更信任。
如果你需要同时兼容 FingerprintManager 和 BiometricPrompt,可以写一个抽象层。我之前的项目就是这么干的——底层用 BiometricPrompt,如果 API 版本低于 28,就回退到 FingerprintManager。
10.5 知识体系图
下面这张图,是我梳理的 Android 9 生物识别适配的核心逻辑:
10.6 总结一下
Android 9 的 BiometricPrompt,说白了就是 Google 帮你把生物识别的脏活累活都干了。你只需要关注业务逻辑,不用再操心不同硬件的差异。
我个人建议,新项目直接上 BiometricPrompt。老项目如果还在用 FingerprintManager,可以考虑逐步迁移。但要注意——迁移不是简单的替换,你得重新设计认证流程,尤其是错误处理和回退机制。
我曾经在一个金融项目里,因为没处理好 BiometricPrompt 的回退逻辑,导致部分机型无法使用指纹认证。后来花了整整两天才排查出来——原来是 CryptoObject 的初始化时机不对。嗯,从那以后,我每次写生物识别代码,都会先检查加密对象的有效性。
核心要点:
- Android 9 是 BiometricPrompt 的起点,支持指纹、虹膜、人脸
- FingerprintManager 已过时,不建议在新代码中使用
- 注意 CryptoObject 的创建和异常处理
- 设备兼容性检查不能省