Android之指纹解锁
最近项目里需要用到指纹解锁的功能,所以也是各种查资料,在这里总结一下。
指纹解锁是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之指纹解锁相关推荐
- android 解锁流程,Android Q 指纹解锁流程
Android Q 指纹解锁流程 // Authentation Finger Schedule: (close Screen, Authentation with finger(Success)) ...
- android开发指纹解锁,Android-指纹解锁技术
什么是指纹解锁技术 指纹解锁技术原理理解 指纹解锁技术的优势和缺点 在Android中的应用开发 什么是指纹解锁技术 根据人的指纹来验证是否能够解锁的技术,类似于通过输入密码来解锁,都是通过一定的数字 ...
- android one指纹解锁,Microsoft OneDrive for Android终于获得指纹解锁
有了这个新版本,有了这个新版本,微软Android的OneDrive将支持指纹解锁,这意味着你可以通过扫描指纹来保护存储在云中的文件,并通过简单扫描指纹轻松进行身份验证. 毋庸置疑,此功能需要手机上的 ...
- android one指纹解锁,三款小米新机正秘密研发:含Android One型号、均搭载屏幕指纹...
在小米9/9 SE应用上第五代光学屏幕指纹后,小米称,屏幕指纹从此进入大规模实用阶段.而小米产品总监王腾Thomas 也曾在微博表示,2019年的目标是让更多中端机也能用上. 经XDA挖掘,小米正在秘 ...
- Android:三星指纹解锁SDK
三星指纹解锁从三星官网SDK中进行下载: http://developer.samsung.com/galaxy#pass pass密码接口:就是为开发者进行准备的
- android one指纹解锁,基于android7.1.1第一次指纹设置必须安全解锁分析
环境:ubuntu14.04 基于高通的android7.1.1代码(同aosp差别不大) 1.现象:第一次直接设置指纹后,然后锁屏,不能够直接使用指纹进行解锁而是提示使用密码,pin码,图案等安全锁 ...
- android one指纹解锁,小米用屏幕内指纹扫描仪准备了两部Android One手机
2017年9月发布时,小米米A1几乎成功一夜成名.小西米去年夏天推出了Mi A2和Mi A2 Lite.现在,正如XDA开发者所揭示的那样,中国品牌正在筹备第三代产品阵容.代号为"bambo ...
- android one指纹解锁,Android下的全键盘情怀 黑莓KEYone体验
黑莓官方的说法是这种组合能为用户提供比5.5英寸全触控手机更大的输入空间,使用之后的感觉是,输入的确更加方便,但平日使用,没有全触控那么方便. KEYone采用了阳极氧化边框,延伸到前边板并直接与屏幕 ...
- android keyguard,Android8.1 SystemUI Keyguard之指纹解锁流程
手指在指纹传感器上摸一下就能解锁,Keyguard是怎么做到的呢? 下面我们就跟着源码,解析这整个过程. 何时开始监听指纹传感器? 先来看下IKeyguardService这个binder接口有哪些回 ...
最新文章
- MySQL的EXPLAIN的SELECT TYPE
- python中的正则表达式
- 【Leetcode | 235】 235. 二叉搜索树的最近公共祖先
- SQLAllocStmt与SQLFreeStmt
- 使用IDEA创建SpringBoot项目
- Class 'QrCode' not found ? 和 laravel 生成二维码接口(Simple QrCod)
- 分布式日志收集系统实践(视频教程)
- 离散数学计算机专业论文,【计算机专业《离散数学》教学研究】计算机专业离散数学...
- Python 进阶之路
- Qt中其他类调用窗口中的ui控件
- gaster字体转换器_哥特字体在线生成,哥特字体在线生成器,哥特字体在线转换
- 虚拟机建Mac系统步骤
- 蓝牙电子产品加拿大IC认证周期
- 【编程DIY】一.几个有趣的小程序
- 旗鱼SailfishOS SDK for Windows初体验
- 【输入法】搜狗输入法中英文切换
- Android笔记之天气预报接口
- ☼ 什么是DST以及它对IT设备、软件的影响 ☼
- 重塑价值:新一代ITSM平台的建设、咨询与实施
- 网络编程(CMD 窗口中通过局域网实现聊天对话)
热门文章
- 洛谷 [P1638 逛画展] (尺取法)
- 模拟电子技术基础实验6.5
- linux下邮件服务器 qmail sendmail postfix - 三种MTA的比较
- linux命令行连接百度网盘快速上传下载数据(bypy)
- 秒杀系统的技术架构设计与实现
- 操作系统之生产者与消费者
- 【100%通过率】华为OD机试真题 C++ 实现【无向图染色】【2022.11 Q4新题】
- 机器学习(五):初级matplitlib绘图-其他绘图样式和3维绘图
- CentOS 程序设置开机启动脚本并自动输入账号密码
- 怎么用 UDP 实现 TCP?