获取手机指纹库指纹信息

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

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));
注:未经授权,不得转载!!!

你可能感兴趣的:(获取手机指纹库指纹信息)