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

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

(0)

相关推荐

  • Android6.0指纹识别开发案例

    Android M指纹的资料太少,经过一段时间阅读原生Android代码,写了以下例子,贡献出来给需要帮助的人. 以下内容基于64位的高通CPU,搭载fpc1020芯片,此部分代码在原生android上做了更改,以应付工厂指纹的测试.原生android指纹录入需要采集10次(因不同的芯片而定). 代码简单说明: 1. FingerPrintEnrollBase类: 重要的是 public interface Listener { void onEnrollmentHelp(CharSequenc

  • Android 指纹识别详解及实现方法

    最近项目需要使用到指纹识别的功能,查阅了相关资料后,整理成此文. 指纹识别是在Android 6.0之后新增的功能,因此在使用的时候需要先判断用户手机的系统版本是否支持指纹识别.另外,实际开发场景中,使用指纹的主要场景有两种: 纯本地使用.即用户在本地完成指纹识别后,不需要将指纹的相关信息给后台. 与后台交互.用户在本地完成指纹识别后,需要将指纹相关的信息传给后台. 由于使用指纹识别功能需要一个加密对象(CryptoObject)该对象一般是由对称加密或者非对称加密获得.上述两种开发场景的实现大

  • Android 指纹识别开发实例

    Android M指纹的资料太少,经过一段时间阅读原生Android代码,写了以下例子,贡献出来给需要帮助的人. 以下内容基于64位的高通CPU,搭载fpc1020芯片,此部分代码在原生android上做了更改,以应付工厂指纹的测试.原生android指纹录入需要采集10次(因不同的芯片而定). 代码简单说明: 1. FingerPrintEnrollBase类: 重要的是 Java代码 public interface Listener { void onEnrollmentHelp(Char

  • Android 6.0指纹识别App开发案例

    在android 6.0中google终于给android系统加上了指纹识别的支持,这个功能在iPhone上早就已经实现了,并且在很多厂商的定制的ROM中也都自己内部实现这个功能了,这个功能来的有点晚啊.在google全新发布的nexus设备:nexus 5x和nexus 6p中都携带了一颗指纹识别芯片在设备的背面,如下图(图片来自网络): 笔者手中的设备就是图上的那台黑色的nexus 5x,话说这台机器很是好看呢!手感超棒! 废话不多说,下面我出一个指纹识别的demo app,并且详细说明怎么

  • Android指纹识别功能深入浅出分析到实战(6.0以下系统解决方案)

    指纹识别这个名词听起来并不陌生,但是实际开发过程中用得并不多.Google从Android6.0(api23)开始才提供标准指纹识别支持,并对外提供指纹识别相关的接口.本文除了能适配6.0及以上系统,主要还提供6.0以下设备适配解决方案. 指纹识别用途 大概列举几个指纹识别的用途 系统解锁 应用锁 支付认证 普通的登录认证 指纹识别Google官方文档 官方标准库 Google提供的与指纹识别相关的核心类不多,主类是FingerprintManager,主类依赖三个内部类,如下图所示: Fing

  • Android指纹识别API初试

    在android6.0之后谷歌对指纹识别进行了官方支持,今天还在放假,所以就随意尝试了一下这个api,但是遇到了各种各样的问题  ①在使用FingerPrintManager这个类实现的时候发现了很多问题,这个类里面的一些函数是被hide了的,也就是我们不能调用,比如enroll(),也就是说,当前的官方支持其实是有限的,我们能读取到本机已经存在的指纹(用于解锁的),然后验证这些指纹,但是不能让用户在app使用的时候录入一个指纹,用于app的其他功能,这个是一个缺陷吧目前来说,下面的图也是展示了

  • Android中的指纹识别demo开发实例

    指纹识别是在Android 6.0之后新增的功能,因此在使用的时候需要先判断用户手机的系统版本是否支持指纹识别.另外,实际开发场景中,使用指纹的主要场景有两种: 纯本地使用.即用户在本地完成指纹识别后,不需要将指纹的相关信息给后台. 与后台交互.用户在本地完成指纹识别后,需要将指纹相关的信息传给后台. 由于使用指纹识别功能需要一个加密对象(CryptoObject)该对象一般是由对称加密或者非对称加密获得.上述两种开发场景的实现大同小异,主要区别在于加密过程中密钥的创建和使用,一般来说,纯本地的

  • android 指纹识别调用实现方法及示例代码

    activity_main.xml源码 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="

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

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

  • Android USB转串口通信开发实例详解

     Android USB转串口通信开发实例详解 好久没有写文章了,年前公司新开了一个项目,是和usb转串口通信相关的,需求是用安卓平板通过usb转接后与好几个外设进行通信,一直忙到最近,才慢慢闲下来,趁着这个周末不忙,记录下usb转串口通信开发的基本流程. 我们开发使用的是usb主机模式,即:安卓平板作为主机,usb外设作为从机进行数据通信.整个开发流程可以总结为以下几点: 1.发现设备 UsbManager usbManager = (UsbManager) context.getSystem

  • Android 音乐播放器的开发实例详解

    本文将引导大家做一个音乐播放器,在做这个Android开发实例的过程中,能够帮助大家进一步熟悉和掌握学过的ListView和其他一些组件.为了有更好的学习效果,其中很多功能我们手动实现,例如音乐播放的快进快退等. 先欣赏下本实例完成后运行的界面效果: 首先我们建立项目,我使用的SDK是Android2.2的,然后在XML中进行布局. 上方是一个ListView用来显示我们的音乐列表,中间是一个SeekBar可以拖动当前音乐的播放进度,之所以用SeekBar而不用ProgressBar是因为我们需

  • Python进行Restful API开发实例详解

    目录 1. Flask-RESTful 2. fastapi + nacos服务注册 2.1 post 2.2 get请求接收list参数 2.3 请求URL进行文件下载 2.4 获取Request Headers的Authorization,并使用JWT解析 1. Flask-RESTful 1.安装pip依赖 [root@bigdata001 ~]# [root@bigdata001 ~]# pip3 install flask [root@bigdata001 ~]# [root@bigd

  • JavaScript 模块化开发实例详解【seajs、requirejs库使用】

    本文实例讲述了JavaScript 模块化开发.分享给大家供大家参考,具体如下: JS开发的问题 冲突 依赖 JS引入的文件,产生依赖. 使用命名空间解决: 命名空间的弊端 调用的时候 名字比较长. 只能减低冲突,不能完全避免 SeaJs使用 引入sea.js的库 如何变成模块? define 如何调用模块? exports 和 seajs.use 如何依赖模块? require //html: <script src="js/sea.js" type="text/ja

  • 微信小程序开发实例详解

    "小程序"破解IDE + Demo:https://github.com/gavinkwoe/weapp-ide-crack.git 资源汇总:https://github.com/Aufree/awesome-wechat-weapp 官方简易教程·MINA:http://wxopen.notedown.cn/ Hello小程序 - 非官方:http://www.helloxcx.com 微信应用号开发教程:https://my.oschina.net/wwnick/blog/750

  • python验证码识别的实例详解

    其实关于验证码识别涉及很多方面的内容,入手难度大,但是入手后,可拓展性又非常广泛,可玩性极强,成就感也很足,对这感兴趣的朋友们下面跟着小编一起来学习学习吧. 依赖 sudo apt-get install python-imaging sudo apt-get install tesseract-ocr pip install pytesseract 利用google ocr来识别验证码 from PIL import Image import pytesseract image = Image

  • Vue拖拽组件开发实例详解

    为什么选择Vue? 主要原因:对于前端开发来说,兼容性是我们必须要考虑的问题之一.我们的项目不需要兼容低版本浏览器.项目本身也是一个数据驱动型的.加之,Vue本身具有以下主要特性: •使用虚拟DOM: •轻量级框架: •高效的数据绑定: •灵活的组件系统: •完整的开发生态链. 这就是我们为什么选择Vue框架的一些原因. 为什么要封装成一个Vue组件? 主要目的是可提高代码的复用性和可维护性. •复用性:组件化后,一些样式和逻辑均通过配置参数的方式去差异化体现,所以参数的可配置性提高了组件的复用

随机推荐