16、多指纹录入与管理:系统指纹设置跳转、检测已录入指纹数量、指纹重命名、删除指纹

指纹功能做完了,能解锁了,是不是就完事了?

说实话,在真实项目中,这往往只是开始。用户会问:「我能不能录两个指纹?」「那个叫‘手指1’的指纹能改个名吗?」「我换手机了,旧指纹怎么删?」

嗯,这些问题,咱们今天一次性解决。

16.1 跳转到系统指纹设置页

有时候,用户想管理指纹,但你的App里并没有指纹管理界面。怎么办?

我个人的习惯是,直接帮用户跳转到系统的「安全与指纹」设置页。这样既省事,又不会因为权限问题被拒。

// 跳转到系统指纹设置页
public void openFingerprintSettings(Context context) {
    Intent intent = new Intent(Settings.ACTION_SECURITY_SETTINGS);
    // 部分厂商的路径不同,可以尝试以下备选
    // Settings.ACTION_FINGERPRINT_ENROLL
    if (intent.resolveActivity(context.getPackageManager()) != null) {
        context.startActivity(intent);
    } else {
        // 备选方案:跳转到安全设置
        intent = new Intent(Settings.ACTION_SECURITY_SETTINGS);
        context.startActivity(intent);
    }
}
⚠️ 注意: 不同厂商(华为、小米、OPPO)的指纹设置路径可能不一样。我曾经在适配某款机型时,发现 Settings.ACTION_FINGERPRINT_ENROLL 根本不存在,最后只能 fallback 到安全设置页。建议上线前多测几台真机。

16.2 检测已录入指纹数量

为什么要知道指纹数量?

你想想看,如果用户只录了一个指纹,你却在界面上显示「请选择手指」,那不是闹笑话吗?

Android 官方其实没有直接提供「查询已录入指纹数量」的 API。但我们可以通过 FingerprintManager 或者 BiometricManager 来间接判断。

// 检测是否已录入指纹
public boolean hasEnrolledFingerprints(Context context) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        FingerprintManager fingerprintManager = 
            (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE);
        if (fingerprintManager != null) {
            return fingerprintManager.hasEnrolledFingerprints();
        }
    }
    return false;
}

但注意,这个方法只能告诉你「有没有」,不能告诉你「有几个」。如果你真的需要数量,我建议你换个思路:

  • 在 App 本地维护一个指纹列表(比如用 SharedPreferences 存指纹 ID 和名称)
  • 每次用户录入新指纹时,同步更新本地列表
  • 删除指纹时,也同步删除本地记录
💡 小技巧: 我曾在项目中用 Room 数据库来存储指纹信息,这样即使 App 被清理,数据也不会丢。而且 Room 支持 LiveData,可以实时更新 UI。

16.3 指纹重命名

用户录了指纹,系统默认叫「手指1」「手指2」……这名字太没个性了。

用户想改成「右手拇指」「左手食指」,怎么办?

嗯,这里有个坑:Android 系统并没有提供「重命名指纹」的公开 API。也就是说,你不能通过代码直接修改系统里指纹的名称。

那怎么办?

我个人的做法是:在 App 内部维护一个映射表。

// 指纹重命名(App 内部维护)
public class FingerprintManager {
    private SharedPreferences preferences;
    
    public void renameFingerprint(String fingerprintId, String newName) {
        preferences.edit()
            .putString("fingerprint_" + fingerprintId, newName)
            .apply();
    }
    
    public String getFingerprintName(String fingerprintId) {
        String defaultName = "手指 " + fingerprintId;
        return preferences.getString("fingerprint_" + fingerprintId, defaultName);
    }
}

说白了,就是「骗」一下用户。系统里还是叫「手指1」,但在你的 App 里,你可以显示成「右手拇指」。用户开心,你也省事。

📌 核心思路: 不要试图修改系统数据,而是用本地映射来「覆盖」显示。这是 Android 开发中常见的「曲线救国」策略。

16.4 删除指纹

删除指纹,同样没有公开 API。你不能通过代码直接删除系统里的指纹。

那怎么办?

我建议你跳转到系统指纹管理页,让用户自己删。

// 跳转到指纹管理页
public void openFingerprintManagement(Context context) {
    Intent intent = new Intent(Settings.ACTION_FINGERPRINT_ENROLL);
    // 部分机型需要这个 Action
    // Settings.ACTION_SECURITY_SETTINGS
    context.startActivity(intent);
}

但如果你非要「看起来像是 App 里删除了指纹」,可以这样做:

  1. 在 App 的指纹列表里,显示所有已录入的指纹(从本地数据库读取)
  2. 用户点击「删除」时,弹窗提示「请在系统设置中删除该指纹」
  3. 同时,删除本地数据库中的对应记录
  4. 下次用户再打开 App,这个指纹就不显示了
⚠️ 重要提醒: 千万不要欺骗用户!如果你只是删除了本地记录,但系统里指纹还在,用户可能会误以为指纹已经删除,造成安全隐患。我建议在弹窗里明确告知用户:「请在系统设置中删除该指纹,App 将同步更新。」

16.5 知识体系总览

来,我画了一张图,帮你理清今天的内容。

多指纹录入与管理知识体系 指纹管理核心 跳转系统设置 检测指纹数量 指纹重命名 删除指纹 核心原则:不直接修改系统数据,通过本地映射 + 跳转系统设置实现管理 Settings.ACTION_SECURITY_SETTINGS hasEnrolledFingerprints() 本地映射表 跳转系统设置页

16.6 避坑指南 & 经验总结

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

  • 不要假设所有厂商都支持同一个 Intent Action。 我曾经在适配某款手机时,Settings.ACTION_FINGERPRINT_ENROLL 直接崩溃,最后用 ACTION_SECURITY_SETTINGS 才搞定。
  • 指纹 ID 不是固定的。 用户删除指纹再重新录入,系统可能会分配新的 ID。所以本地映射表要定期清理无效记录。
  • 用户体验很重要。 如果用户点了「管理指纹」,你直接跳转到系统设置,用户可能会觉得「怎么跳到外面去了?」。我建议在跳转前加一个确认弹窗,告诉用户「即将跳转到系统设置页进行指纹管理」。
  • 不要过度设计。 如果你的 App 只是用指纹做登录验证,其实不需要搞这么复杂。直接跳转系统设置就够用了。

📌 一句话总结: 指纹管理,说白了就是「能跳转就跳转,不能跳转就本地映射」。别跟系统 API 死磕,灵活一点,用户开心,你也省心。


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