– 前言
需求说明:app经常要验证码验证用户手机号保证安全性,现在想接入指纹识别来代替验证码验证,不支持指纹识别的设备照常用验证码。
了解API
Android在23(Android M 6.0)新增了对指纹识别的硬件支持,应用可以通过调用系统Api实现指纹验证相关功能,相对于传统的手势,密码等验证方式,指纹验证安全性更高,速度也更快。
- Android 23(Android M 6.0)新增 指纹识别Api:FingerprintManager,开发者通过该Api打开指纹认证时,系统仅会打开设备的指纹模块监听,并不会有UI相关展示,需要开发者根据自身App要求弹出对应的交互流程。
- Android 28(Android P 9.0)新增 生物识别Api:BiometricManager,推荐替换掉原来的FM,囊括指纹、人脸、虹膜等生物特征识别,不过现阶段只开放了指纹相关。开发者使用该Api进行指纹认证时,系统在会打开设备的指纹模块监听的同时,还会弹出一个系统级的Dialog提示用户正在进行指纹解锁流程。
Goolge提供的API只是指纹跟设备中的指纹库进行比对,得到验证的状态(成功/失败…),无法得到唯一的指纹信息,也就无法绑定账户。 前端提供一个开关,当用户开启指纹后,将状态保存在本地,但每次指纹识别前都要判断满足要求才能正常走流程。
– 认证流程
第零步:在清单文件中申明权限
<!-- 使用生物特征识别、触摸传感器和指纹认证的许可-->
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
<uses-permission android:name="android.permission.USE_FINGERPRINT"/>
第一步:判断设备满足认证的前提要求(四步)
- Android6.0及以上版本
- 判断硬件支持指纹识别
- 判断已设置密码锁
- 判断至少注册了一个指纹
/**
* 1.>Android 6.0 & 2.支持指纹识别 & 3.已设置开屏密码 & 4.已录入指纹
*/
private boolean isSupportFingerprint(){
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
Toast.makeText(mContext, "系统版本过低,不支持指纹功能", Toast.LENGTH_SHORT).show();
return false;
} else {
KeyguardManager keyguardManager = mContext.getSystemService(KeyguardManager.class);
fingerprintManager = (FingerprintManager)getSystemService(FINGERPRINT_SERVICE);
if (fingerprintManager == null || !fingerprintManager.isHardwareDetected()) {
Toast.makeText(mContext, "您的系统不支持指纹功能", Toast.LENGTH_SHORT).show();
return false;
} else if (keyguardManager != null && !keyguardManager.isKeyguardSecure()) {
Toast.makeText(mContext, "请在设置界面开启锁屏密码,并录入指纹后再尝试", Toast.LENGTH_LONG).show();
return false;
} else if (!fingerprintManager.hasEnrolledFingerprints()) {
Toast.makeText(mContext, "您还没有录入指纹, 请在系统设置录入至少一个指纹", Toast.LENGTH_LONG).show();
return false;
}
return true;
}
第二步:两种设备调用不同的指纹管理类
判断版本在9.0以上还是以下,以上用FingerprintManager类进行指纹识别,并自定义监听时的Dialog,以下用BiometricManager类进行指纹识别,自动调用系统Dialog。
1.两种流程
private void selectMode(String num){
if(isSupportFingerprint()){
//9.0以上
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.P){
overallIdentification();
}else {
//6.0~9.0 自定义的Dialog和回调接口
FingerprintDialogFragment dialogFragment = new FingerprintDialogFragment();
dialogFragment.setArguments(bundle);
dialogFragment.showNow(getSupportFragmentManager(),"FingerprintDialogFragment");
dialo