Android指纹识别,提升APP用户体验,从这里开始!(1)
在对指纹识别功能进行实践时, 我将该功能开发成了开源库,并已发布于Github上。通过gradle, 可以方便地进行依赖管理。使用方法较为简便, 几行简单的代码就能实现, 再传入一个验证结果监听即可完成整个流程。
下面对部分实现过程做一下介绍,详细的 Api 及源码请移步 Github。
示例
Android 6.0 指纹识别框,开发者自定义:

Android 9.0 指纹识别框,系统提供:

具体来说,指纹标识和取消按钮的文字颜色设置取决于属性 colorPrimary 的颜色值。
指纹识别管理类
FingerprintVerifyManager 作为指纹识别库的入口点,在该系统中负责对指纹识别进行管理,并且能够实现相应的初始化功能;为了完成这些任务,系统会调用 FingerprintVerifyManager.Builder 来具体实现相关操作。
在该类中,依据不同的手机系统版本提供了两种指纹识别接口(FingerprintManagerCompat 或 BiometricPrompt),其中 BiometricPrompt 支持开关功能,并且默认处于禁用状态。
public FingerprintVerifyManager(Builder builder) {
创建一个FingerPrint类型的实例变量fingerprint;
// (适用于Android P及以上版本)
当Android P及以上版本时:
如果启用Android P功能,则赋值为新的FingerprintAndrP实例;
否则赋值为新的FingerprintAndrM实例;
否则:
如果当前系统版本低于Android 6.0,则调用builder回调 onError方法并显示错误提示信息;
返回;
}
……
fingerprint.authenticate(builder.context, bean, builder.callback);
}
其中 IFingerprint 代表指纹识别功能这一接口,并支持了兼容于Android 6.0的FingerprintAndrM接口以及兼容于Android 9.0的Fingerpr印andP接口。
public interface IFingerprint {
/**
- 初始化并调起指纹识别
-
- @param context
- @param verificationDialogStyleBean 指纹识别框样式
- @param callback 通知开发者指纹识别结果
*/
void authenticate(Activity context, VerificationDialogStyleBean verificationDialogStyleBean, FingerprintCallback callback);
}
基于Android 6.0 实现指纹识别
在之前的描述中提到了一个名为 FingerprintAndrM 的类。具体实现了指纹识别功能的是遵循 Android 6.0 标准的一个实现类
@RequiresApi(api = Build_VERSION_CODES.M设置为)
类FingerpringAndrM实现接口IFingerpring {
// 其他内容
}
@RequiresApi(api = Build_VERSION_CODES.M设置为)
类FingerpringAndrM实现接口IFingerpring {
// 其他内容
}
private static String TAG = FingerprintAndrM.class.getName();
protected Activity context;
private static FpAndrM fingerprintAndrM;
//此字段用于存储指纹验证框实例。
private static FpDialog fingerprintDialog;
//该字段指向调用者的指纹回调方法。
private FpCallback fingerprintCallback;
//用于实现对指纹识别系统的取消扫描功能
private CancellationSignal cancellationSignal;
//定义指纹加密功能模块
private static FingerprintManagerCompat.CryptoObject cryptoObject;
//针对Android 6.0及以上版本的系统进行指纹管理
private FingerprintManagerCompat fingerprintManagerCompat;
@Override
public void authenticate(Activity context, VerificationDialogStyleBean bean, FingerprintCallback callback) {
//判断指纹识别是否可用
if (!canAuthenticate(context, callback))
return;
this.context被赋值为context变量;
this.fingerprintCallback属性被赋值为callback;
// 针对Android 6.0版本的指纹管理进行实例化操作;
该类将调用FingerprintManagerCompat.from方法来初始化该属性
//Deactivate scanning, each time after cancellation, a new instance needs to be created.
cancellationSignal = initializeNewCgetTokenSource();
cancellationSignal.setOnCancelListener((_) -> fingerprintDialog.dismiss());
// 启动指纹验证操作
fingerprintManagerCompat.authentify(cryptoObject, 0, cancellationSignal, authenticationCallback, null);
// 初始化并配置指纹验证框
fingerprintDialog = new FingerprintDialog(context)->setActionListener(dialogActionListener)->setDialogStyle(Bean);
fingerprintDialog.show(context.getEntityManager(), $TAG);
}
public static instanceOf FpInstance fingerprintObject newInstance() {
if ((instanceof fingerprintObject).is_null()) {
synchronized ((Class)fingerPrintObject.class, threadRearrange){
if ((instanceof fingerprintObject).is_null()) {
fingerprintObject = new FpInstance();
}
}
}
// 进行指纹加密操作以确保在进行指纹认证之前cipher已经初始化完毕
try{
cryptoObject = new FpInstance.CryptoHelper().createCipherHelper().createCipher();
} catch (Exception e){
e.printStackTrace();
}
return fingerprintObject;
}
/**
- 指纹识别模块用于捕获用户的指纹输入,并对按键事件进行监听。
*/
// 定义一个实现OnDialogActionListener接口的内部类
private class FingerprintDialog.OnDialogActionListener extends FingerprintDialog.OnDialogActionListener {
// 重写onUsepwd方法
@Override
public void onUserPassword() {
// 如果fingerprintCallback存在且不为空,则调用其onUserPassword方法
if (fingerprintCallback?.isNot-null()) {
fingerprintCallback.onUserPassword();
}
}
}
@Override
public void onCancle() {//取消指纹验证, 通知被调用者
if (fingerprintCallback != null)
fingerprintCallback.onCancle();
}
@Override
public void onDismiss() {//验证框消失, 取消手指认证
if (cancellationSignal != null && !cancellationSignal.isCanceled())
cancellationSignal.cancel();
}
/**
- 指纹验证结果回调
*/
private FingerprintManagerCompat.AuthenticationCallback authenticationCallback = new FingerprintManagerCompat.AuthenticationCallback() {
@Override
public void onAuthenticationError(int errMsgId, CharSequence errString) {
super.onAuthenticationError(errMsgId, errString);
fingerprintDialog.setTip(errString.toString(), R.color.biometricprompt_color_FF5555);
}
@Override 实现者重载
public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) {
返回指定帮助信息的方法 调用父类方法
super.onAuthenticationHelp(helpMsgId, helpString);
}
设置辅助认证响应的提示信息为指定的颜色
fingerprintDialog.setTip(helpString.toString(), R.color.biometricprompt_color_FF5555);
@Override
public void onAuthenticationSucceeded(FingerprintManagerCompat.AuthenticationResult result) {
super.onAuthenticationSucceeded(result);
fingerprintDialog.setTip(
context.getString(R string biometricprompt_verify_success),
R color biometricprompt_color_82C785
);
fingerprintCallback.onSuccess();
fingerprintDialog.dismiss();
}
@Override
public void onAuthenticationFailed() {
super method execution;
fingerprintDialog.set the tip text (using context.getString to retrieve the appropriate message string) with the specified color code;
fingerprintCallback executed();
}
/*
在Android Q中集成Google的BiometricManager API即可实现对指纹识别硬件的支持性检测以及指纹添加功能的验证。
目前该功能已处于未开放状态,并被标记为Stub(存根),这可能影响后续的判断结果。
因此,在此情况下仍需依赖Android 6.0的相关API来进行评估。
private boolean canAuthenticate(Context context, FingerprintCallback fingerprintCallback) {
...]
- 系统是否具备指纹识别功能
- 【
}
该系统需要特别关注 CancellationSignal 与其相关的功能模块之间的相互作用关系。即当手指滑动导致识别框消失时,则必须立即停止对指纹扫描器的操作以避免误触发此功能,在超时时间段内系统方能保证用户的正常操作流程得以维持(即便如此也会弹出一个用于辅助判断的功能窗口)。
基于Android 9.0 实现指纹识别
如上所述,在上文中提到FingerprintAndrP 是一个基于 Android 9.0 开发的指纹识别具体实现类。
@RequiresApi(requires the API implementation, api = Build.VERSION_CODES.P)
public class FingerprintAndrP implements IFingerprint {
private static FingerPrintsDataNode FingerprintsAnalyzer; // 指向调用者的指纹分析组件。
class-Level Variable: // 调用端的指纹回调
private FpCallback fingerprintHandler; // 指向指纹处理逻辑。
//负责实现对...对象的取消扫描操作
private CancellationSignal cancellationSignal;
//指纹加密功能模块
private static BiometricPrompt.CryptoObject cryptoObject;
@Override
public void authenticate(FingerprintCallback callback, Activity context, VerificationDialogStyleBean verificationDialogStyleBean) {
//判断指纹识别是否可用
if (!canAuthenticate(context, callback))
return;
this.fingerprintCallback = callback;
/*
- 初始化 BiometricPrompt.Builder
*/
……
//构建 BiometricPrompt
/* Construct a BiometricPrompt object*/
biometricPrompt is constructed as a BiometricPrompt instance.
//本扫描器将被取消后需重新创建实例
cancellationSignal := new CancellationSignal();
cancellationSignal.setOnCancelListener(() -> {
});
/*
启动指纹认证模块并进行身份验证等待
- Executor:
- cryptoContext = context.getMainExecutor()
*/
biometricPrompt.authenticate(cryptoObject, cancellationSignal, cryptoContext, callbackFunction);
}
public static FingerprintAndrP newInstance() {
if (fingerprintAndrP == null) {
// 在获取指纹之前互斥锁以避免竞态条件
synchronized (FingerprintAndrM.class) {
if (fingerprintAndrP == null) {
fingerprintAndrP = new FingerprintAndrP();
}
}
}
// 确保在获取指纹之前完成Cipher初始化以防止未完成初始化导致的安全漏洞
try {
cryptoObject = new BiometricPrompt.CryptoObject(new CipherHelper().createCipher());
} catch (Exception e) {
e.printStackTrace();
}
}
return fingerprintAndrP;
}
/**
- 认证结果回调
*/
private BiometricPrompt.AuthenticationCallback authenticationCallback = new BiometricPrompt.AuthenticationCallback() {
@Override
public void onAuthenticationError(int errorCode, CharSequence errString) {
super.onAuthenticationError(errorCode, errString);
if (fingerprintCallback != null) {
if (errorCode == 5) {//用户取消指纹验证,不必向用户抛提示信息
fingerprintCallback.onCancel();
return;
}
fingerprintCallback.onError(errorCode, errString.toString());
}
}
@Override
public void onAuthenticationHelp(int helpCode, CharSequence helpString) {
super.onAuthenticationHelp(helpCode, helpString);
if (fingerprintCallback != null)
fingerprintCallback.onError(helpCode, String.valueOf(helpString));
}
@Override
public void onAuthenticationSuccess(BiometricResult result) {
super.onAuthenticationSuccess(result);
当生物识别回调服务不为空时, 执行生物识别成功后的操作;
}
@Override
public void onAuthenticationFailed() {
super.onAuthenticationFailed();
if (fingerprintCallback != null)
fingerprintCallback.onFailed();
}
};
/*
- 在 Android Q 中,Google 提供了 BiometricManager API 来检测指纹识别硬件的可用性以及是否添加指纹。
- 不过该功能尚未实现。
- 因此暂时还是需要用 Android 6.0 的相关 API 来进行判断。
/*
- 硬件是否支持指纹识别?
- 【
意识到大多数初级到中级的Android程序员。
为了汇编整理一份《2024年Android移动开发全套学习资料》,其初衷同样很简单——旨在帮助那些希望自主提升却又不知从何处开始学习的朋友,并减轻他们的学习负担。





既有针对初学者提供的入门学习资源,也有专为有丰富开发经验的专业开发者设计的专业进阶课程;系统性地覆盖了超过95%的核心Android开发知识点,并形成了一个全面的知识体系!
因为文件较大,在这里仅对部分目录进行截图展示。每个节点内部包含大公司面试题库、学习笔记、代码学习资料、实战项目以及教学视频,并且会持续进行更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

小福利:
在当下这个信息高度碎片化的时代里,在这个快速变化的时代背景中,在当前这样一个信息爆炸的时代背景下……
大多数朋友拥有大量的数据资源
如果大家感觉在网上查找信息资源非常杂乱、不成体系的话,我也有一套比较系统的方法分享给大家,并且我平时也会经常研读。
2021大厂最新Android面试真题解析

各个模块学习视频:如数据结构与算法

只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。


这份体系学习笔记旨在针对以下几点问题进行说明:第一,在当前环境下学习知识确实存在一定的碎片化现象,并且缺乏明确的学习路径和进一步提升的方向;第二,在已经积累了一段时间的发展过程中感到迷茫困惑,并不清楚该如何进一步提升;第三,在到了适当的时候还不太清楚该怎么发展是选择转向管理还是加强技术研究等方向。如果你有相关需求或者疑问的话,在这里恰好有一份详细的资料提供参考和解答,请随时领取阅读吧!通过点赞+评论的方式即可获取哦!说不定能帮到你呢!
《互联网大厂面试真题解析与进阶开发核心学习笔记合集+讲解视频课程+完整实战项目源码资源》立即通过直达通道获取完整资源!
中…(img-YepIxl6Q-1712649115124)]
[外链图片转存中…(img-HoMzhM3G-1712649115125)]
这份体系学习笔记适用于以下人群:
- 学习知识分散且缺乏系统性的人群;
- 经过一定时间积累后仍无法明确个人发展方向的人群;
- 到了适当时机开始思考职业转型方向但感到困惑的人群。
如果你有相关需求,请随时联系我。或许能帮助你实现职业转变的目标!
《互联网巨头企业的面试题解析及深入探讨开发技术的课程资料》点击传送门即可获取!
