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 避坑指南

这里有几个坑,我一个个说:

坑1:设备不支持虹膜怎么办?

Android 9 的 BiometricPrompt 不会告诉你具体支持哪种方式。你得自己用 PackageManager 去查。我建议先检查是否有虹膜硬件,再决定是否显示虹膜认证选项。

坑2:BiometricPrompt 在 Android 9 上不支持自定义 UI

你想想看,如果你非要改弹窗样式,那只能自己实现一套认证流程。但我不建议这么做——系统弹窗的安全性更高,用户也更信任。

小技巧:

如果你需要同时兼容 FingerprintManager 和 BiometricPrompt,可以写一个抽象层。我之前的项目就是这么干的——底层用 BiometricPrompt,如果 API 版本低于 28,就回退到 FingerprintManager。

10.5 知识体系图

下面这张图,是我梳理的 Android 9 生物识别适配的核心逻辑:

Android 9 生物识别适配核心逻辑 BiometricPrompt 统一认证入口 系统级 UI 多生物识别支持 回调机制 仅支持指纹 需自定义 UI 功能有限 错误处理繁琐 左侧:BiometricPrompt 特性 | 右侧:FingerprintManager 局限

10.6 总结一下

Android 9 的 BiometricPrompt,说白了就是 Google 帮你把生物识别的脏活累活都干了。你只需要关注业务逻辑,不用再操心不同硬件的差异。

我个人建议,新项目直接上 BiometricPrompt。老项目如果还在用 FingerprintManager,可以考虑逐步迁移。但要注意——迁移不是简单的替换,你得重新设计认证流程,尤其是错误处理和回退机制。

我曾经在一个金融项目里,因为没处理好 BiometricPrompt 的回退逻辑,导致部分机型无法使用指纹认证。后来花了整整两天才排查出来——原来是 CryptoObject 的初始化时机不对。嗯,从那以后,我每次写生物识别代码,都会先检查加密对象的有效性。

核心要点:

  • Android 9 是 BiometricPrompt 的起点,支持指纹、虹膜、人脸
  • FingerprintManager 已过时,不建议在新代码中使用
  • 注意 CryptoObject 的创建和异常处理
  • 设备兼容性检查不能省

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