android API 23时新增的功能,指纹识别
主要类:FingerpringManager
在API28后,FingerpringManager被遗弃,使用BiometricPrompt,此时授权识别的弹窗不能自定义,
只能使用官方统一弹窗,只能设置各个授权文案。各个开发商内部实现可能不一致。
通过只是使用指纹识别,直接使用官方api即可,但出于安全或业务场景需求,很多都需要去检测生物库信息是否变更,
如指纹库在重新指纹识别前是否发生变更,这个官方api就没有提供方法,需要我们自己实现。
检测指纹库是否发生变更
参考:
通过检测密钥查看是否变更(https://www.jianshu.com/p/dbb1a43cfb21)
在API28以前,指纹库信息时可以通过反射获取,获取的信息有指纹id、groupId、指纹名称、指纹个数、设备id等等,
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
Log.d(TAG, "getFingerPrintInfo: ");
FingerprintManager fingerprintManager = (FingerprintManager) getCurrentActivity().getSystemService(Context.FINGERPRINT_SERVICE);
try{
Class clz = Class.forName("android.hardware.fingerprint.FingerprintManager");
Method method = clz.getDeclaredMethod("getEnrolledFingerprints", new Class[]{});
method.setAccessible(true);
Object obj = method.invoke(fingerprintManager, null);
if (obj != null) {
Log.e(TAG, "objStr:" + JsonUtils.toJson(obj));
List<FingerprintBean> list = (List<FingerprintBean>) JsonUtils.fromJson(objStr, new TypeToken<List<FingerprintBean>>(){}.getType());
}
}catch (Exception e) {
e.printStackTrace();
}
}
而FingerprintBean是这样的:
public class FingerprintBean implements Serializable {
private static final long serialVersionUID = 1L;
private long mDeviceId;
private long mFingerId;
private long mGroupId;
private String mName;
}
最理想的方式是我们反射获取到这些指纹库信息,然后将这些信息保存到本地,每次调用指纹识别时,获取当前指纹库信息与之前的指纹库信息比较,
只有不同即可判定指纹库信息变更,
但在实际操作中,发现在手机上获取到的指纹id只是简单的1、2、3即指纹库里的排列顺序,而指纹名称是可以随意更改,groupId、deviceId都为0,
如果使用这些信息去校验,错误率太高。
还有一种方式即是上面参考链接中的,
检测指纹库密钥信息是否变更
但在上面链接那种方法中,有几个问题:
1、增加、删除指纹无法检测
2、使用修改指纹的手指识别后才能检测出修改
于是将反射、密钥检测两者结合,
先反射获取指纹库信息,只是比较指纹库指纹个数,先判断指纹个数是否发生变更,就可知道指纹库信息变更了
如果指纹个数没有变更,再来校验密钥是否发生变化
网友评论