浅谈Android 指纹解锁技术
作者:前山饭店 发布时间:2023-06-04 18:59:06
什么是指纹解锁技术
根据人的指纹来验证是否能够解锁的技术,类似于通过输入密码来解锁,都是通过一定的数字特征来解锁。
指纹解锁技术原理理解
首先说明每个人的每个指纹信息都是独一无二的,皮肤纹路在图案,断点,交叉点上各不相同,通过光学感应读出指纹的图片信息也是独一无二的。
先保存一个人的指纹特征(图片信息根据算法生成的数据),然后再使用时利用这个人的这个指纹特征去和先前保存的指纹特征做对比,对比一致则解锁成功,对比不一致则解锁失败,对比结果并不是100%一样,而可以按照一个比例来判定,比如90%一样,也可以判定为一致,这个可以根据硬件来设定。
指纹解锁技术的优势和缺点
优点:1.使用便捷,直接使用自身的生物特征就可判断能否使用,判别速度快,而输入数字或者拼图解锁是麻烦的并且容易被别人看到。
缺点:1.安全性不高,指纹是可以被收集的,所以一旦别人收集了你的指纹信息,那需要你指纹解锁的东西将非常危险,而且在不注意的情况下很容易被有心的人收集。
在Android中的应用开发
对Android系统来说,指纹解锁是Android6.0才添加的新功能,到Android P系统还会强化指纹解锁的功能,提供越来越便捷的API。
android.hardware.fingerprint
可以看到在Android P系统中FingerprintDialog以及其中的包含类将会替代FingerprintManager以及其中包含类。原理应该差不多,封装的更简洁易用。
废话少说,在Android手机中如何开发?
1.在应用AndroidManifest.xml文件中添加权限:
<uses-permission android:name="android.permission.USE_FINGERPRINT"/>
2.获取到指纹管理对象的引用:
FingerprintManagerCompat fingerprint = FingerprintManagerCompat.from(this); //v4包下的API,包装内部已经判断Android系统版本是否大于6.0,这也是官方推荐的方式
FingerprintManager fingerprint2 = (FingerprintManager) getSystemService(Context.FINGERPRINT_SERVICE); //Android 6.0包下的API
其实指纹对象依次调用三个方法就够了,
第一步
/**
* Determine if fingerprint hardware is present and functional.
* @return true if hardware is present and functional, false otherwise.
*/
fingerprint.isHardwareDetected(); // 判断设备是否支持指纹解锁
第二步
/**
* Determine if there is at least one fingerprint enrolled.
* @return true if at least one fingerprint is enrolled, false otherwise
*/
fingerprint.hasEnrolledFingerprints(); //判断设备是否以保存过指纹信息,至少需要保存过一个
第三步
/**
* @param crypto object associated with the call or null if none required. //不太理解,加密指纹特征还是什么,可以不加密置为null
* @param flags optional flags; should be 0 //设置标记,暂时无用
* @param cancel an object that can be used to cancel authentication //取消验证
* @param callback an object to receive authentication events //系统认证完成之后,回调该接口
* @param handler an optional handler for events //处理callback接口后,界面的处理,默认是主线程handler
*/
fingerprint.authenticate(crypto, flags,cancel,callback,handler) //验证指纹
再来说明各个参数的实现
crypto = null; //可以置为null,愿意了解的人可以参考底部博客和源码
flags = 0;
cancel = new CancellationSignal();
callback = new FingerprintManagerCompat.AuthenticationCallback() {
@Override
public void onAuthenticationError(int errMsgId, CharSequence errString) {
super.onAuthenticationError(errMsgId, errString);
//验证错误时,回调该方法。当连续验证5次错误时,将会走onAuthenticationFailed()方法
handler.obtainMessage(1,errMsgId,0).sendToTarget();
}
@Override
public void onAuthenticationSucceeded(FingerprintManagerCompat.AuthenticationResult result) {
super.onAuthenticationSucceeded(result);
//验证成功时,回调该方法。fingerprint对象不能再验证
handler.obtainMessage(2).sendToTarget();
}
@Override
public void onAuthenticationFailed() {
super.onAuthenticationFailed();
//验证失败时,回调该方法。fingerprint对象不能再验证并且需要等待一段时间才能重新创建指纹管理对象进行验证
handler.obtainMessage(3).sendToTarget();
}
};
handler = new Handler(getMainLooper()) { //也可以置为null,系统自动处理
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1: //验证错误
//todo 界面处理
handleErrorCode(msg.arg1);
break;
case 2: //验证成功
//todo 界面处理
cancel = null;
break;
case 3: //验证失败
//todo 界面处理
cancel = null;
break;
default:
super.handleMessage(msg);
}
};
//对应不同的错误,可以有不同的操作
private void handleErrorCode(int code) {
switch (code) {
case FingerprintManager.FINGERPRINT_ERROR_CANCELED:
//todo 指纹传感器不可用,该操作被取消
break;
case FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE:
//todo 当前设备不可用,请稍后再试
break;
case FingerprintManager.FINGERPRINT_ERROR_LOCKOUT:
//todo 由于太多次尝试失败导致被锁,该操作被取消
break;
case FingerprintManager.FINGERPRINT_ERROR_NO_SPACE:
//todo 没有足够的存储空间保存这次操作,该操作不能完成
break;
case FingerprintManager.FINGERPRINT_ERROR_TIMEOUT:
//todo 操作时间太长,一般为30秒
break;
case FingerprintManager.FINGERPRINT_ERROR_UNABLE_TO_PROCESS:
//todo 传感器不能处理当前指纹图片
break;
}
}
来源:https://www.jianshu.com/p/7b0ab6565bfd
猜你喜欢
- 打开ITerm终端进入命令输入,sudo su,输入密码创建.bash_profile文件touch .bash_profile打开.bas
- 概述中国特色社会主义乱码问题是我们经常会碰到的问题,解决的办法有很多,本文分别介绍了GET方式和POST方式中文乱码解决方案中一劳永逸的办法
- 一、简介在上篇 ElasticSearch 文章中,我们详细的介绍了 ElasticSearch 的各种 api 使用。实际的项目开发过程中
- 本文实例讲述了java GUI编程之布局控制器(Layout)。分享给大家供大家参考,具体如下:布局控制器,是用来系统自动分配各个compo
- 1.可能是缓存导致的。解决方法:清除缓存!2.全局编译可能项目依赖别的模块,别的模块修改未进行编译,这时须先对依赖模块进行编译补充知识:ID
- 一.显示、隐藏 jQuery 中显示方法为:.show(),隐藏方法为:.hide()。在无参数的时候,只是硬性的显示内容和隐藏内
- spring和mybatis整合整合思路需要spring通过单例方式管理SqlSessionFactory。spring和mybatis整合
- 在很多项目中,为了安全安全考虑,需要对数据包进行加密处理,本文实例所述的即为C#加密代码,在应用开发中有很大的实用价值。说起数据包加密,其实
- 先讲一下java中的反射:反射就是将类别的各个组成部分进行剖析,可以得到每个组成部分,就可以对每一部分进行操作反射机制应用场景:逆向代码、动
- 引言当我们通过@ConfigurationProperties注解实现配置 bean的时候,如果默认的配置属性转换无法满足我们的需求的时候,
- JAVA并发总览核心问题并不是程序的漏洞导致的,而是操作系统底层机制导致的原子性:可见性问题:改的是缓存,但是缓存对另一个线程不可见有序性问
- 本文实例讲述了Android编程实现的一键锁屏程序。分享给大家供大家参考,具体如下:据笔者了解,所有的Android手机都用电源键来手动锁屏
- 背景何为延迟队列?顾名思义,延迟队列就是进入该队列的消息会被延迟消费的队列。而一般的队列,消息一旦入队了之后就会被消费者马上消费。场景一:在
- 什么是POM?POM是项目对象模型(Project Object Model)的简称,它是Maven项目中的文件,使用XML表示,名称叫做p
- 在平时的开发过程中,会有很多场景需要实时监听文件的变化,如下:1、通过实时监控 mysql 的 binlog 日志实现数据同步2、修改配置文
- 以下总结是2016/3/23在做一个网站时遇到的一个功能模块,现在将总结从为知笔记上搬家到CSDN,与大家共享,欢迎指正。0.准备工作 0.
- 本文为大家分享的java算法计算阶乘,在学习Java课程时经常会遇到求阶乘问题,今天接跟大家一起探讨一下代码如下:package com.x
- 状态机机制状态机机制是一种常用的解决状态扭转问题的方法,通过定义状态以及状态之间的转移规则来控制状态的流转。对于订单系统,我们可以使用状态机
- 序列化(Serialize)是将对象转换成字节流,并将其用于存储或传输的过程,主要用途是保存对象的状态,以便在需要时重新创建该对象;反序列化
- 一、redis发布订阅简介Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收信息。可以参