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

 更新时间:2017年04月18日 08:40:26   投稿:lqh  
这篇文章主要介绍了Android6.0指纹识别开发实例详解的相关资料,需要的朋友可以参考下

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接口实现。

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

相关文章

  • 分析Android 11.0Settings源码之主界面加载

    分析Android 11.0Settings源码之主界面加载

    这篇文章主要介绍了分析Android 11.0Settings源码之主界面加载,对Android源码感兴趣的同学,可以着重看一下
    2021-04-04
  • Android 2.3.7.r1 camera录像过程中按menu菜单键时会停止录像

    Android 2.3.7.r1 camera录像过程中按menu菜单键时会停止录像

    android GB版本的camera录像过程中按“菜单”键会停止录像,改成录像时按menu键不做处理,具体修改方法如下,感兴趣的朋友可以参考下哈
    2013-06-06
  • Android自定义环形LoadingView效果

    Android自定义环形LoadingView效果

    这篇文章主要为大家详细介绍了Android自定义环形LoadingView效果的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • Android view自定义带文字带进度的控件

    Android view自定义带文字带进度的控件

    这篇文章主要为大家详细介绍了Android view自定义带文字带进度的控件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • Flutter实现底部导航栏

    Flutter实现底部导航栏

    这篇文章主要为大家详细介绍了Flutter实现底部导航栏的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • Jetpack Compose修饰符专项精讲

    Jetpack Compose修饰符专项精讲

    在今年的Google/IO大会上,亮相了一个全新的 Android 原生 UI 开发框架-Jetpack Compose, 与苹果的SwiftIUI一样,Jetpack Compose是一个声明式的UI框架,它可简化并加快Android上的界面开发,使用更少的代码、强大的工具和直观的 Kotlin API,快速让应用生动而精彩
    2022-10-10
  • android ViewPager实现一个无限轮播图

    android ViewPager实现一个无限轮播图

    大家好,本篇文章主要讲的是android ViewPager实现一个无限轮播图,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • Android使用SoundPool播放音效实例

    Android使用SoundPool播放音效实例

    这篇文章主要为大家详细介绍了Android使用SoundPool播放音效,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • android使用videoview播放视频

    android使用videoview播放视频

    这篇文章主要介绍了Android利用自带VideoView控件播放视频的示例,需要的朋友可以参考下
    2014-02-02
  • Android 滑动监听的实例详解

    Android 滑动监听的实例详解

    这篇文章主要介绍了Android 滑动监听的实例详解的相关资料,希望通过本能帮助到大家,需要的朋友可以参考下
    2017-09-09

最新评论