前言
安卓的指纹识别功能是在Android 6.0(SDK:23)的时候提供出来的,主要使用的就是FingerprintManager这个类并且后来在support v4库中添加了FingerprintManagerCompat类,它主要也是对FingerprintManager进行了一定的封装。
在Android9.0(SDK:28)之后,谷歌已经不再推荐使用FingerprintManager,而是新增了BiometricPrompt这个类,如类名所示,在生物识别未来的发展中,除了指纹设备验证,可能还有添加面容验证等功能。而目前的话,还仅支持指纹识别,不过还是在指纹识别上进行了统一,例如:要求开发者使用统一的指纹识别UI,不再支持开发者自定义指纹识别UI了,不过如图,官方文档中指纹识别UI界面上的标题、描述等还是可以让开发者自己去设置的,可是灵活性还是比较差。
兼容性问题
如前言所描述,在我们开发指纹识别的功能时一定要做好兼容性的处理,在Android SDK23 - SDK27之间我们使用support v4库中提供的FingerprintManagerCompat,而在Android SDK28以后,我们最好是使用BiometricPrompt,下图为版本判断代码
指纹识别开发
首先,我们要创建有关指纹设备的类并且使用该类判断手机是否能够正常使用指纹识别功能。
Android6.0创建指纹识别有关的类:
Android9.0创建指纹识别有关的类:
在Android SDK30之前,我们都可以使用FingerprintManagerCompat提供的方法来判断手机是否能够正常使用指纹识别功能
Android6.0判断手机是否能够正常使用指纹识别功能:
isHardwareDetected():该方法用来判断系统硬件是否支持指纹识别,若手机系统的硬件不支持指纹识别可以弹框提示用户;
hasEnrolledFingerprints():该方法是用来判断你的设备在系统设置里面是否设置了指纹,若设备未设置指纹,可以提示用户并且让用户跳转到系统的设置界面,自己去添加指纹;
Android10判断手机是否能够正常使用指纹识别功能:
可以通过创建BiometricManager,并且使用该类提供的canAuthenticate()方法就可以直接判断设备是否能够正常使用指纹识别功能。
当我们做完了版本判断和设备是否能够正常使用指纹识别功能判断后,就可以开始调用指纹识别的功能了。
指纹识别功能最主要的就是authenticate()这个方法!
Android6.0指纹识别方法:
首页我们来介绍一下authenticate方法中的参数
crypto:这是一个加密类的对象,指纹扫描器会使用这个对象来判断认证结果的合法性。这个对象可以是null,但是这样的话,就意味这app无条件信任认证的结果。app在这种情况下是得承担风险的。因此,建议这个参数不要置为null;
cancel:这是CancellationSignal类的一个对象,这个对象是用来在指纹识别器扫描用户指纹的时候取消当前的扫描操作,如果不取消的话,那么指纹扫描器会一直扫描到超时(一般为30s,取决于具体的厂商实现),这样的话就会比较耗电;
flags:标志位,根据官方提示,默认为0;
callback:指纹识别结果的回调,是指纹识别中最重要的参数了,在回调中我们可以处理指纹识别的各种情况;
handler:这是Handler类的对象,如果这个参数不为null的话,那么FingerprintManager将会使用这个handler中的looper来处理来自指纹识别硬件的消息。通常来讲,开发是不用提供这个参数的,可以直接置为null,因为FingerprintManager会默认使用app的main looper来处理;
Android9.0指纹识别方法:
exceutor:作用与Android6.0的handler 类似,用来分发指纹识别的回调事件。
另外的三个参数也可以在Andorid6.0的authenticate中找到对应的参数。
最后,我们来介绍一下指纹认证之后的回调方法,这可是非常重要的。
Android6.0指纹认证回调方法:
首先我们来解释一下这些接口的含义:
onAuthenticationError(int errMsgId, CharSequence errString):该接口会在系统指纹认证出现不可恢复的错误的时候才会调用,并且参数errorCode给出的错误码标识了错误原因。比如,连续识别错误5次指纹、指纹硬件不可用等等。
onAuthenticationFailed():该接口会在系统指纹认证失败的情况的下回调,此失败和onAuthenticationError的失败是不一样的,这里的认证失败指的是所有的指纹信息都采集完整,没有异常,但是这个采集的指纹和之前注册的指纹不相符的。
onAuthenticationHelp(int helpMsgId, CharSequence helpString):该接口是指出现了可以恢复的异常的情况下会回调,例如指纹采集不完整。
onAuthenticationSucceeded(FingerprintManagerCompat.AuthenticationResult result):该接口则是指纹认证成功的情况下会回调的。我们在调用authenticate的时候,我们的CryptoObject不是null,所以我们可以在这个接口中通过AuthenticationResult来获得Cipher对象然后调用它的doFinal方法。doFinal方法会检查结果是不是被拦截或者篡改过,如果是的话会抛出一个异常。当我们发现这些异常的时候都应该将认证当做失败来处理。
Android9.0指纹认证回调方法:
同理,新的回调的方法含义也差不多。详情可以看技术文档,这里贴上链接:android.hardware.biometrics | Android Developers
DEMO
这里我就贴一下简单的开发DEMO,详细的处理,可以根据不同的需求,自己去进行相应的开发。
总结
指纹识别的开发步骤:
1.开发者要进行版本的判断,然后根据版本的判断在Android6.0和Android9.0使用不同的指纹认证类;
2.然后验证设备是否支持指纹认证,若设备可以,则继续步骤3,若不行,则提示用户;
3.最后我们就能调用authenticate方法并创建该方法中所需要的参数来唤起指纹认证界面;
注意:一定要处理好回调的逻辑!
2021年10月15日程序猿小钟带着【Android指纹识别】到此一游~