当前位置: 移动技术网 > IT编程>移动开发>Android > Android6.0指纹识别开发实例详解

Android6.0指纹识别开发实例详解

2019年07月24日  | 移动技术网IT编程  | 我要评论

圣大保罗女包,广东顺德,沙伊峰

android6.0指纹识别开发实例详解

最近在做android指纹相关的功能,谷歌在android6.0及以上版本对指纹识别进行了官方支持。当时在fingerprintmanager和fingerprintmanagercompat这两个之间纠结,其中使用fingerprintmanager要引入com.android.support:appcompat-v7包,考虑到包的大小,决定使用v4兼容包fingerprintmanagercompat来实现。

主要实现的工具类fingerprintutil:验证手机是否支持指纹识别方法callfingerprintverify(),主要验证手机硬件是否支持(6.0及以上),有没有录入指纹,然后有没有开启锁屏密码,开始验证对于识别成功,失败可以进行相应的回调处理。

实例代码:

 public class fingerprintutil{

 private fingerprintmanagercompat mfingerprintmanager;
 private keyguardmanager mkeymanager;
 private cancellationsignal mcancellationsignal;
 private activity mactivity;

 public fingerprintutil(context ctx) {
  mactivity = (activity) ctx;
  mfingerprintmanager = fingerprintmanagercompat.from(mactivity);
  mkeymanager = (keyguardmanager) mactivity.getsystemservice(context.keyguard_service);

 }

 public void callfingerprintverify(final ifingerprintresultlistener listener) {
  if (!ishardwaredetected()) {
   return;
  }
  if (!ishasenrolledfingerprints()) {
   if (listener != null) {
    listener.onnoenroll();
   }
   return;
  }
  if (!iskeyguardsecure()) {
   if (listener != null) {
    listener.oninsecurity();
   }
   return;
  }
  if (listener != null) {
   listener.onsupport();
  }

  if (listener != null) {
   listener.onauthenticatestart();
  }
  if (mcancellationsignal == null) {
   mcancellationsignal = new cancellationsignal();
  }
  try {
   mfingerprintmanager.authenticate(null, 0, mcancellationsignal, new fingerprintmanagercompat.authenticationcallback() {
    //多次尝试都失败会走onauthenticationerror,会停止响应一段时间,提示尝试次数过多,请稍后再试。
    @override
    public void onauthenticationerror(int errmsgid, charsequence errstring) {
     if (listener != null)
      listener.onauthenticateerror(errmsgid, errstring);
    }

    //指纹验证失败走此方法,例如小米前4次验证失败走onauthenticationfailed,第5次走onauthenticationerror
    @override
    public void onauthenticationfailed() {
     if (listener != null)
      listener.onauthenticatefailed();
    }

    @override
    public void onauthenticationhelp(int helpmsgid, charsequence helpstring) {
     if (listener != null)
      listener.onauthenticatehelp(helpmsgid, helpstring);

    }

    //当验证的指纹成功时会回调此函数,然后不再监听指纹sensor
    @override
    public void onauthenticationsucceeded(fingerprintmanagercompat.authenticationresult result) {
     if (listener != null)
      listener.onauthenticatesucceeded(result);
    }

   }, null);
  } catch (exception e) {
   e.printstacktrace();
  }
 }

 /**
  * 是否录入指纹,有些设备上即使录入了指纹,但是没有开启锁屏密码的话此方法还是返回false
  *
  * @return
  */
 private boolean ishasenrolledfingerprints() {
  try {
   return mfingerprintmanager.hasenrolledfingerprints();
  } catch (exception e) {
   return false;
  }
 }

 /**
  * 是否有指纹识别硬件支持
  *
  * @return
  */
 public boolean ishardwaredetected() {
  try {
   return mfingerprintmanager.ishardwaredetected();
  } catch (exception e) {
   return false;
  }
 }

 /**
  * 判断是否开启锁屏密码
  *
  * @return
  */
 private boolean iskeyguardsecure() {
  try {
   return mkeymanager.iskeyguardsecure();
  } catch (exception e) {
   return false;
  }

 }

 /**
  * 指纹识别回调接口
  */
 public interface ifingerprintresultlistener {
  void oninsecurity();

  void onnoenroll();

  void onsupport();

  void onauthenticatestart();

  void onauthenticateerror(int errmsgid, charsequence errstring);

  void onauthenticatefailed();

  void onauthenticatehelp(int helpmsgid, charsequence helpstring);

  void onauthenticatesucceeded(fingerprintmanagercompat.authenticationresult result);

 }

 public void cancelauthenticate() {
  if (mcancellationsignal != null) {
   mcancellationsignal.cancel();
   mcancellationsignal = null;
  }
 }


 public void ondestroy() {
  cancelauthenticate();
  mkeymanager = null;
  mfingerprintmanager = null;

 }

参考了一些资料,做了一些验证,得到一些结论:

1、当指纹识别失败后,会调用onauthenticationfailed()方法,这时候指纹传感器并没有关闭,谷歌原生系统给了我们5次重试机会,也就是说,连续调用了4次onauthenticationfailed()方法后,第5次会调用onauthenticateerror(int errmsgid, charsequence errstring)方法,此时errmsgid==7。

2、每次重新授权,哪怕不去校验,取消时会走onauthenticateerror(int errmsgid, charsequence errstring) 方法,其中errmsgid==5,

3、当系统调用了onauthenticationerror()和onauthenticationsucceeded()后,传感器会关闭,只有我们重新授权,再次调用authenticate()方法后才能继续使用指纹识别功能。

4、兼容android6.0以下系统的话,不要使用fingerprintmanagercompat, 低于m的系统版本,fingerprintmanagercompat无论手机是否有指纹识别模块,均认为没有指纹识别,可以用fingerprintmanager来做。

5、考虑到安全因素,最好authenticate(cryptoobject crypto, cancellationsignal cancel, int flags, authenticationcallback callback, handler handler)时加入cryptoobject 。crypto这是一个加密类的对象,指纹扫描器会使用这个对象来判断认证结果的合法性。这个对象可以是null,但是这样的话,就意味着app无条件信任认证的结果,这个过程可能被攻击,数据可以被篡改,这是app在这种情况下必须承担的风险。因此,建议这个参数不要置为null。这个类的实例化有点麻烦,主要使用javax的security接口实现。

 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网