史上最全,Android P指纹应用及源码解析

本文详细介绍了Android P中指纹识别的使用,包括BiometricPrompt和FingerprintManager的API,提供了源码分析和使用示例。BiometricPrompt成为新推荐的指纹交互方式,而FingerprintManager虽然被弃用但仍可使用。文章还涵盖了权限设置、回调处理以及指纹验证的流程,并展示了相关截图。
摘要由CSDN通过智能技术生成

简单使用


首先需要了解以下几点

  • 指纹识别相关api是在Android23版本添加的,所以过早版本的设备是无法使用的;
android.os.Build.VERSION.SDK_INT >= 23 // 不会真有人还在用23以前的手机吧?
  • 在Android28版本,使用BiometricPrompt替代了FingerprintManager,FingerprintManager被标记为@Deprecated,但依然可以使用它,而且BiometricPrompt与FingerprintManager并没有多大区别(Api 29 30中BiometricPrompt新增了一些方法,不在此文涉及),内部实现依然是调用的FingerprintService的相关方法;
  1. 使用BiometricPrompt(Api>=28)
    首先添加权限:
<uses-permission android:name="android.permission.USE_BIOMETRIC" />

BiometricPrompt是用于显示一个系统提供的生物识别对话框,所以我们需要新建一个构造器:

BiometricPrompt biometricPrompt = new BiometricPrompt.Builder(mContext)
                .setTitle("指纹验证")
                .setSubtitle("小标题")
                .setDescription("描述")
                .setNegativeButton("取消", mContext.getMainExecutor(), (dialog, which) -> {
    Log.i(TAG, "cancel fingerprint authenticate"); })
                .build();

setTitle、setSubtitle、setDescription方法就不多说了,大伙可以在下面的效果图中直接看到。这里说一下setNegativeButton方法,这个设置项是必须有的,而且里面的三个参数都不能为null,否则会抛出异常。setNegativeButton方法用于设置指纹识别对话框的取消按钮和点击事件,第一个参数为要在提示的否定按钮上显示的文本;第二个参数为该onClick事件要执行的执行器,这里可以选择主程序执行器;第三个参数为按钮点击时间,这里打印了一条log。大家可以在这里对取消按钮做一些操作,比如将其改为“密码验证”按钮等。
与setNegativeButton类似的还有一个setPositiveButton方法,该方法的使用与setNegativeButton相同,不过它是@hide的,第三方应用无法调用,大家手上有源码的可以试试看。
接下来就是指纹验证了:

biometricPrompt.authenticate(new CancellationSignal(), mContext.getMainExecutor(), authenticationCallback);

以上三个参数都是@NonNull的。
第一个参数用于取消当前指纹验证操作,可以为它设置监听器CancellationSignal#setOnCancelListener,如果没有取消,指纹感应设备会一直等待指纹输入,直到超时;
第二个参数用于分发指纹识别结果的回调事件,这里可以设为主程序执行器;
第三个参数是最重要的一个参数,用于处理指纹识别结果,它是一个内部类:

BiometricPrompt.AuthenticationCallback authenticationCallback = new BiometricPrompt.AuthenticationCallback() {
   
            @Override
            public void onAuthenticationError(int errorCode, CharSequence errString) {
   
                super.onAuthenticationError(errorCode, errString);
                Log.i(TAG, "onAuthenticationError errorCode: " + errorCode + " errString: " + errString);
            }

            @Override
            public void onAuthenticationHelp(int helpCode, CharSequence helpString) {
   
                super.onAuthenticationHelp(helpCode, helpString);
                Log.i(TAG, "onAuthenticationHelp helpCode:" + helpCode + "helpString: " + helpString);
            }

            @Override
            public void onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result) {
   
                super.onAuthenticationSucceeded(result);
                Log.i(TAG, "onAuthenticationSucceeded");
            }

            @Override
            public void onAuthenticationFailed() {
   
                super.onAuthenticationFailed();
                Log.i(TAG, "onAuthenticationFailed");
            }
        };

BiometricPrompt#authenticate为我们发起了一个指纹识别请求,识别结果则可以在这个callback里处理。
onAuthenticationError会在识别出现错误时调用,它通常表示一个预期之外的,不可修复的错误,比如设备不支持指纹识别功能、指纹传感器损毁、设备中不存在已录入的指纹、失败次数过多等。errorCode与errorString都是在系统内部定义好的,可以打印出来;
onAuthenticationFailed会在认证失败时调用,它与onAuthenticationError不同,这个失败通常是可预期的,可以修复的,比如输入的指纹与设备指纹库指纹不匹配,这个时候可以再次放上手指进行验证,直到超过验证次数;
onAuthenticationHelp用于指纹认证过程中给出一些帮助信息,比如手指移动过快、指纹传感器有脏污、手指移动过慢等,这些帮助信息都可以在helpString获取到;
onAuthenticationSucceeded则在输入指纹与指纹库指纹相匹配时调用,当验证成功时,将会立即结束此次指纹验证过程,再放上手指在传感器上不会有响应。
BiometricPrompt#authenticate还有一个重载方法:

biometricPrompt.authenticate(CryptoObject crypto, CancellationSignal cancel, Executor executor, BiometricAuthenticator.AuthenticationCallback callback);

多了一个参数CryptoObject,这是一个密码对象的包装类,关于这个参数,我们会在下文进行介绍。
有关BiometricPrompt内容就是这么多了,下面给出几张效果图:


  1. 使用FingerprintManager(Api>=23)
    首先添加权限
<uses-permission android:name="android.permission.USE_FINGERPRINT" />

判断是否设备是否支持指纹功能,下面三个判断都需要为true(BiometricPrompt不需要此判断,如果不支持,BiometricPrompt会调用onAuthenticationError方法)

// 是否存在指纹功能模块
mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FINGERPRINT);
// 设备是否有硬件支持
fingerprintManager.isHardwareDetected();
// 设备中是否存在已录入指纹
fingerprintManager.hasEnrolledFingerprints();

新建一个指纹认证结果回调:

FingerprintManager.AuthenticationCallback authenticationCallback = new FingerprintManager.AuthenticationCallback() {
   
            @Override
            public void onAuthenticationError(int errorCode, CharSequence errString) {
   
                Log.i(TAG, "onAuthenticationError errorCode: " + errorCode + " errString: " + errString);
                super.onAuthenticationError(errorCode, errString);
            }

            @Override
            public void onAuthenticationHelp(int helpCode, CharSequence helpString) {
   
                Log.i(TAG, "onAuthenticationError helpCode: " + helpCode + " helpString: " + helpString);
                
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值