Android指纹识别API初试
在android6.0之后谷歌对指纹识别进行了官方支持,今天还在放假,所以就随意尝试了一下这个api,但是遇到了各种各样的问题
①在使用fingerprintmanager这个类实现的时候发现了很多问题,这个类里面的一些函数是被hide了的,也就是我们不能调用,比如enroll(),也就是说,当前的官方支持其实是有限的,我们能读取到本机已经存在的指纹(用于解锁的),然后验证这些指纹,但是不能让用户在app使用的时候录入一个指纹,用于app的其他功能,这个是一个缺陷吧目前来说,下面的图也是展示了识别一个可以用来解锁的指纹的功能。
②使用fingerprintmanager的时候会遇到要在应用中判断权限的问题,不清楚是因为android m要求的还是api需要,调用的时候也没有反应,既没有功能,也没有提示给予权限,原因有待查证。
③在一顿尝试无果之后发现了两个特别的类,一个叫做fingerprintmanagercompat,这是一个兼容的fingerprint操作类,还有一个类似的叫做fingerprintmanagercompatapi23,使用这两个类也能实现到识别指纹的功能,但是也是有局限的,如①所说的。这两个类都能实现这个效果,但是需要api level 23,如果达不到不会报错,这些类会什么都不做。
展示图,因为没有真机,所以只能用模拟器调试一下,这里也只能用官方的,genymotion免费版貌似不能模拟指纹:
直接上代码:
public class mainactivity extends appcompatactivity implements view.onclicklistener { private static final string tag = "mainactivity"; private button check; private fingerprintmanagercompat manager; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); check = (button) findviewbyid(r.id.btn_check); check.setonclicklistener(this); // 获取一个fingerprintmanagercompat的实例 manager = fingerprintmanagercompat.from(this); } @override public void onclick(view v) { switch (v.getid()) { case r.id.btn_check: /** * 开始验证,什么时候停止由系统来确定,如果验证成功,那么系统会关系sensor,如果失败,则允许 * 多次尝试,如果依旧失败,则会拒绝一段时间,然后关闭sensor,过一段时候之后再重新允许尝试 * * 第四个参数为重点,需要传入一个fingerprintmanagercompat.authenticationcallback的子类 * 并重写一些方法,不同的情况回调不同的函数 */ manager.authenticate(null, 0, null, new mycallback(), null); break; } } public class mycallback extends fingerprintmanagercompat.authenticationcallback { private static final string tag = "mycallback"; // 当出现错误的时候回调此函数,比如多次尝试都失败了的时候,errstring是错误信息 @override public void onauthenticationerror(int errmsgid, charsequence errstring) { log.d(tag, "onauthenticationerror: " + errstring); } // 当指纹验证失败的时候会回调此函数,失败之后允许多次尝试,失败次数过多会停止响应一段时间然后再停止sensor的工作 @override public void onauthenticationfailed() { log.d(tag, "onauthenticationfailed: " + "验证失败"); } @override public void onauthenticationhelp(int helpmsgid, charsequence helpstring) { log.d(tag, "onauthenticationhelp: " + helpstring); } // 当验证的指纹成功时会回调此函数,然后不再监听指纹sensor @override public void onauthenticationsucceeded(fingerprintmanagercompat.authenticationresult result) { log.d(tag, "onauthenticationsucceeded: " + "验证成功"); } } }
有朋友提出了问题,这里记录下:
如何让失败或者成功之后sensor继续保持监听新的指纹?
答:因为api较新的缘故,这个兼容的manager类还不能做到自动重启的功能,但是我们可以自己写一个。因为api中规定了如果回调了error或者succeed方法之后,sensor会被关闭,直到下一次重新调用authenticate方法授权,但是我们不能在error或succeed直接调用这个方法,因为处于安全性的考虑,不允许开发者短时间内连续授权,经过粗略的测试,android允许我们在30s之后重新打开sensor授权监听,所以我们要做的,就是通过handler的sendmessagedelayed方法发送一个延迟的消息,再在handler中重新调用authenticate方法,具体的代码如下:
private handler handler = new handler() { @override public void handlemessage(message msg) { super.handlemessage(msg); log.d(tag, "handlemessage: 重启指纹模块"); manager.authenticate(null, 0, null, new mycallback(), handler); } };
@override public void onauthenticationerror(int errmsgid, charsequence errstring) { handler.sendmessagedelayed(new message(), 1000 * 30); log.d(tag, "onauthenticationerror: " + errstring); } @override public void onauthenticationsucceeded(fingerprintmanagercompat.authenticationresult result) { handler.sendmessagedelayed(new message(), 1000 * 30); log.d(tag, "onauthenticationsucceeded: " + "验证成功"); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: 实例讲解java定时任务
推荐阅读