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);
}
}
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 和名称)
- 每次用户录入新指纹时,同步更新本地列表
- 删除指纹时,也同步删除本地记录
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 里,你可以显示成「右手拇指」。用户开心,你也省事。
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 里删除了指纹」,可以这样做:
- 在 App 的指纹列表里,显示所有已录入的指纹(从本地数据库读取)
- 用户点击「删除」时,弹窗提示「请在系统设置中删除该指纹」
- 同时,删除本地数据库中的对应记录
- 下次用户再打开 App,这个指纹就不显示了
16.5 知识体系总览
来,我画了一张图,帮你理清今天的内容。
16.6 避坑指南 & 经验总结
最后,分享几个我踩过的坑:
- 不要假设所有厂商都支持同一个 Intent Action。 我曾经在适配某款手机时,Settings.ACTION_FINGERPRINT_ENROLL 直接崩溃,最后用 ACTION_SECURITY_SETTINGS 才搞定。
- 指纹 ID 不是固定的。 用户删除指纹再重新录入,系统可能会分配新的 ID。所以本地映射表要定期清理无效记录。
- 用户体验很重要。 如果用户点了「管理指纹」,你直接跳转到系统设置,用户可能会觉得「怎么跳到外面去了?」。我建议在跳转前加一个确认弹窗,告诉用户「即将跳转到系统设置页进行指纹管理」。
- 不要过度设计。 如果你的 App 只是用指纹做登录验证,其实不需要搞这么复杂。直接跳转系统设置就够用了。
📌 一句话总结: 指纹管理,说白了就是「能跳转就跳转,不能跳转就本地映射」。别跟系统 API 死磕,灵活一点,用户开心,你也省心。
公众号:蓝海资料掘金营,微信deep3321