最近项目里需要用到指纹解锁的功能,所以也是各种查资料,在这里总结一下。

指纹解锁是Android6.0新增的功能,因此在使用的时候需要先判断用户的手机版本是否支持指纹解锁。

使用指纹识别的对称加密功能的主要流程如下:
1、使用 KeyGenerator 创建一个对称密钥,存放在 KeyStore 里。
2、设置KeyGenParameterSpec.Builder.setUserAuthenticationRequired() 为true。
3、使用创建好的对称密钥初始化一个Cipher对象,并用该对象调用 FingerprintManager.authenticate() 方法启动指纹传感器并开始监听。
4、重写 FingerprintManager.AuthenticationCallback 的几个回调方法,以处理指纹识别成功(onAuthenticationSucceeded())、失败(onAuthenticationFailed() 和 onAuthenticationError())等情况。

创建密钥:

创建密钥要涉及到两个类:KeyStore 和 KeyGenerator。

KeyStore 是用于存储、获取密钥(Key)的容器,获取 KeyStore的方法如下:
try {
keyStore = KeyStore.getInstance(“AndroidKeyStore”);
keyStore.load(null);
} catch (Exception e) {
e.printStackTrace();
}

而生成 Key,如果是对称加密,就需要 KeyGenerator 类。获取一个 KeyGenerator 对象比较简单,方法如下:

// 对称加密, 创建 KeyGenerator 对象
try {
mKeyGenerator = KeyGenerator
.getInstance(KeyProperties.KEY_ALGORITHM_AES, “AndroidKeyStore”);
} catch (NoSuchAlgorithmException | NoSuchProviderException e) {
throw new RuntimeException(“Failed to get an instance of KeyGenerator”, e);
}

获得 KeyGenerator 对象后,就可以生成一个 Key 了:
KeyGenerator mKeyGenerator = KeyGenerator.getInstance(KEY_ALGORITHM, KEYSTORE_NAME);
KeyGenParameterSpec.Builder builder = new KeyGenParameterSpec.Builder
(KEY_NAME, KeyProperties.PURPOSE_DECRYPT | KeyProperties.PURPOSE_ENCRYPT)
.setBlockModes(KeyProperties.BLOCK_MODE_CBC)
.setUserAuthenticationRequired(true)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7);
mKeyGenerator.init(builder.build());
mKeyGenerator.generateKey();

创建并初始化 Cipher 对象

Cipher 对象是一个按照一定的加密规则,将数据进行加密后的一个对象。调用指纹识别功能需要使用到这个对象。创建 Cipher 对象很简单,如同下面代码那样:

cipher = Cipher.getInstance(TRANSFORMATION);

cipher.init(Cipher.ENCRYPT_MODE | Cipher.DECRYPT_MODE, key);

使用指纹识别功能

调用 FingerprintManager 类的的方法authenticate()而已,然后系统会有相应的回调反馈给我们,该方法如下:

public void authenticate(CryptoObject crypto, CancellationSignal cancel, int flags, AuthenticationCallback callback, Handler handler)

该方法的几个参数解释如下:
1、是一个加密对象。还记得之前我们大费周章地创建和初始化的Cipher对象吗?这里的 CryptoObject 对象就是使用 Cipher 对象创建创建出来的:new FingerprintManager.CryptoObject(cipher)。
2、是一个 CancellationSignal 对象,该对象提供了取消操作的能力。创建该对象也很简单,使用 new CancellationSignal() 就可以了。
3、是一个标志,默认为0。
4、是 AuthenticationCallback 对象,它本身是 FingerprintManager 类里面的一个抽象类。该类提供了指纹识别的几个回调方法,包括指纹识别成功、失败等。需要我们重写。
5、Handler,可以用于处理回调事件,可以传null。

完成指纹识别后,还要记得将 AuthenticationCallback 关闭掉:

if (mCancellationSignal != null) {
mCancellationSignal.cancel();
mCancellationSignal = null;
}

重写回调方法
调用了 authenticate() 方法后,系统就会启动指纹传感器,并开始扫描。这时候根据扫描结果,会通过FingerprintManager.AuthenticationCallback类返回几个回调方法:

// 成功
onAuthenticationSucceeded()
// 失败
onAuthenticationFaile()
// 错误
onAuthenticationError()

实际应用中的注意事项

判断用户是否可以使用指纹识别功能

一般来说,为了增加安全性,要求用户在手机的“设置”中开启了密码锁屏功能。当然,使用指纹解锁的前提是至少录入了一个指纹。

// 如果没有设置密码锁屏,则不能使用指纹识别
if (!keyguardManager.isKeyguardSecure()) {
Toast.makeText(this, “请在设置界面开启密码锁屏功能”,
Toast.LENGTH_LONG).show();
}
// 如果没有录入指纹,则不能使用指纹识别
if (!fingerprintManager.hasEnrolledFingerprints()) {
Toast.makeText(this, “您还没有录入指纹, 请在设置界面录入至少一个指纹”,
Toast.LENGTH_LONG).show();
}

关于这三个回调方法,有几点需要注意的:
1.当指纹识别失败后,会调用onAuthenticationFailed()方法,这时候指纹传感器并没有关闭,系统给我们提供了5次重试机会,也就是说,连续调用了5次onAuthenticationFailed()方法后,会调用onAuthenticationError()方法。
2.当系统调用了onAuthenticationError()和onAuthenticationSucceeded()后,传感器会关闭,只有我们重新授权,再次调用authenticate()方法后才能继续使用指纹识别功能。
3.当系统回调了onAuthenticationError()方法关闭传感器后,这种情况下再次调用authenticate()会有一段时间的禁用期,也就是说这段时间里是无法再次使用指纹识别的。当然,具体的禁用时间由手机厂商的系统不同而有略微差别,有的是1分钟,有的是30秒等等。而且,由于手机厂商的系统区别,有些系统上调用了onAuthenticationError()后,在禁用时间内,其他APP里面的指纹识别功能也无法使用,甚至系统的指纹解锁功能也无法使用。而有的系统上,在禁用时间内调用其他APP的指纹解锁功能,或者系统的指纹解锁功能,就能立即重置指纹识别功能。

示例代码
最后, 关于指纹的示例代码地址如下:https://github.com/zhaopingfu/TestFingerprint

个人整理了一个工具类,需要的可以看下:http://download.csdn.net/detail/pf_1308108803/9836341

Android之指纹解锁相关推荐

  1. android 解锁流程,Android Q 指纹解锁流程

    Android Q 指纹解锁流程 // Authentation Finger Schedule: (close Screen, Authentation with finger(Success)) ...

  2. android开发指纹解锁,Android-指纹解锁技术

    什么是指纹解锁技术 指纹解锁技术原理理解 指纹解锁技术的优势和缺点 在Android中的应用开发 什么是指纹解锁技术 根据人的指纹来验证是否能够解锁的技术,类似于通过输入密码来解锁,都是通过一定的数字 ...

  3. android one指纹解锁,Microsoft OneDrive for Android终于获得指纹解锁

    有了这个新版本,有了这个新版本,微软Android的OneDrive将支持指纹解锁,这意味着你可以通过扫描指纹来保护存储在云中的文件,并通过简单扫描指纹轻松进行身份验证. 毋庸置疑,此功能需要手机上的 ...

  4. android one指纹解锁,三款小米新机正秘密研发:含Android One型号、均搭载屏幕指纹...

    在小米9/9 SE应用上第五代光学屏幕指纹后,小米称,屏幕指纹从此进入大规模实用阶段.而小米产品总监王腾Thomas 也曾在微博表示,2019年的目标是让更多中端机也能用上. 经XDA挖掘,小米正在秘 ...

  5. Android:三星指纹解锁SDK

    三星指纹解锁从三星官网SDK中进行下载: http://developer.samsung.com/galaxy#pass pass密码接口:就是为开发者进行准备的

  6. android one指纹解锁,基于android7.1.1第一次指纹设置必须安全解锁分析

    环境:ubuntu14.04 基于高通的android7.1.1代码(同aosp差别不大) 1.现象:第一次直接设置指纹后,然后锁屏,不能够直接使用指纹进行解锁而是提示使用密码,pin码,图案等安全锁 ...

  7. android one指纹解锁,小米用屏幕内指纹扫描仪准备了两部Android One手机

    2017年9月发布时,小米米A1几乎成功一夜成名.小西米去年夏天推出了Mi A2和Mi A2 Lite.现在,正如XDA开发者所揭示的那样,中国品牌正在筹备第三代产品阵容.代号为"bambo ...

  8. android one指纹解锁,Android下的全键盘情怀 黑莓KEYone体验

    黑莓官方的说法是这种组合能为用户提供比5.5英寸全触控手机更大的输入空间,使用之后的感觉是,输入的确更加方便,但平日使用,没有全触控那么方便. KEYone采用了阳极氧化边框,延伸到前边板并直接与屏幕 ...

  9. android keyguard,Android8.1 SystemUI Keyguard之指纹解锁流程

    手指在指纹传感器上摸一下就能解锁,Keyguard是怎么做到的呢? 下面我们就跟着源码,解析这整个过程. 何时开始监听指纹传感器? 先来看下IKeyguardService这个binder接口有哪些回 ...

最新文章

  1. MySQL的EXPLAIN的SELECT TYPE
  2. python中的正则表达式
  3. 【Leetcode | 235】 235. 二叉搜索树的最近公共祖先
  4. SQLAllocStmt与SQLFreeStmt
  5. 使用IDEA创建SpringBoot项目
  6. Class 'QrCode' not found ? 和 laravel 生成二维码接口(Simple QrCod)
  7. 分布式日志收集系统实践(视频教程)
  8. 离散数学计算机专业论文,【计算机专业《离散数学》教学研究】计算机专业离散数学...
  9. Python 进阶之路
  10. Qt中其他类调用窗口中的ui控件
  11. gaster字体转换器_哥特字体在线生成,哥特字体在线生成器,哥特字体在线转换
  12. 虚拟机建Mac系统步骤
  13. 蓝牙电子产品加拿大IC认证周期
  14. 【编程DIY】一.几个有趣的小程序
  15. 旗鱼SailfishOS SDK for Windows初体验
  16. 【输入法】搜狗输入法中英文切换
  17. Android笔记之天气预报接口
  18. ☼ 什么是DST以及它对IT设备、软件的影响 ☼
  19. 重塑价值:新一代ITSM平台的建设、咨询与实施
  20. 网络编程(CMD 窗口中通过局域网实现聊天对话)

热门文章

  1. 洛谷 [P1638 逛画展] (尺取法)
  2. 模拟电子技术基础实验6.5
  3. linux下邮件服务器 qmail sendmail postfix - 三种MTA的比较
  4. linux命令行连接百度网盘快速上传下载数据(bypy)
  5. 秒杀系统的技术架构设计与实现
  6. 操作系统之生产者与消费者
  7. 【100%通过率】华为OD机试真题 C++ 实现【无向图染色】【2022.11 Q4新题】
  8. 机器学习(五):初级matplitlib绘图-其他绘图样式和3维绘图
  9. CentOS 程序设置开机启动脚本并自动输入账号密码
  10. 怎么用 UDP 实现 TCP?