获取手机指纹库指纹信息

来源:互联网 发布:ati hd 4850 mac 编辑:程序博客网 时间:2024/04/30 07:43

本Demo 所示用测试机为华为KIW—UL00
系统版本:Android 6.0.1, API 23
参考谷歌官方文档可知,公开的指纹操作类只有一个FingerprintManager。且暴露的方法有限。具体如下图。
这里写图片描述
故,通过公开的方法想获得指纹库具体信息是不可能的。
参阅FingerprintManager可知,其内部指纹信息类被隐藏了。具体如下图:
这里写图片描述
所以,通过反射获得其内部数据。
具体步骤如下:
Step 1:获得指纹管理类
fingerprintManager = (FingerprintManager) getSystemService(FINGERPRINT_SERVICE);
Step2:通过反射获取指纹库具体信息
参阅FingerprintManager可知(见下图),在其内部只有一个方法返回值为List,即可取到Fragerprint类信息,故通过反射取到此方法,然后对此方法进行赋值。
这里写图片描述
//获取方法
Method method=
FingerprintManager.class.getDeclaredMethod(“getEnrolledFingerprints”);
//对obj进行赋值
Object obj = method.invoke(fingerprintManager);
//对obj进行非空判断,然后对android.hardware.fingerprint.Fingerprint类进行反射,得到具体方法(android.hardware.fingerprint.Fingerprint类部分源码见下图)
这里写图片描述

if (obj != null) {                Class<?> clazz = Class.forName("android.hardware.fingerprint.Fingerprint");                Method getName = clazz.getDeclaredMethod("getName");                Method getFingerId = clazz.getDeclaredMethod("getFingerId");                Method getGroupId = clazz.getDeclaredMethod("getGroupId");                Method getDeviceId = clazz.getDeclaredMethod("getDeviceId");

//因为我们事先知道Object是List,故对其进行向下转型,对其进行遍历,item空了就说明遍历完毕,通过continue关键字,跳出循环。

 for (int i = 0; i < ((List) obj).size(); i++) {            Object item = ((List) obj).get(i);            if (null == item) {                continue;            }

//通过log日志对指纹库具体信息进行输出。
Log.e(TAG,
“指纹name:”+getName.invoke(item)+
” 指纹库ID:”+getGroupId.invoke(item)+
“指纹ID:”+getFingerId.invoke(item)+
“设备Id:”+getDeviceId.invoke(item));
注:未经授权,不得转载!!!

原创粉丝点击