浅谈Android指纹识别技术[通俗易懂]

浅谈Android指纹识别技术[通俗易懂]浅谈Android指纹识别技术当今时代,随着移动智能手机的普及,指纹解锁早已是手机不可或缺的一个功能。除了现在比较新款的iPhone或者部分手机采用了FaceID之外,人们几乎天天都会用到指纹解锁技术。但你知道指纹解锁技术背后的原理吗?原理指纹识别的前提是对指纹的采集,所以我们首先就应该了解第一步:指纹采集。第一步:指纹采集指纹采集主要分为两种方式:滑动式采集和按压式采集滑动式采集是将手指在传感器上滑过,从而使手机获得手指指纹图像。滑动式采集具有成本相对偏低,而且可以采集大面积图像的优势。但这

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

浅谈Android指纹识别技术

当今时代,随着移动智能手机的普及,指纹解锁早已是手机不可或缺的一个功能。除了现在比较新款的iPhone或者部分手机采用了Face ID之外,人们几乎天天都会用到指纹解锁技术。但你知道指纹解锁技术背后的原理吗?

原理

指纹识别的前提是对指纹的采集,所以我们首先就应该了解第一步:指纹采集。

第一步:指纹采集

指纹采集主要分为两种方式:滑动式采集和按压式采集

滑动式采集是将手指在传感器上滑过,从而使手机获得手指指纹图像。滑动式采集具有成本相对偏低,而且可以采集大面积图像的优势。但这种采集方式存在体验较差的问题,使用者需要一个连续规范的滑动动作才能实现采集成功,采集失败的概率大大增加。某品牌手机曾经使用过这种采集方式,因滑动式采集存在的短板而受到诟病。

按压式采集顾名思义就是在传感器上按压实现指纹数据采集,这种采集方式当然用户体验好一些,不过成本比滑动采集高,技术难度也相对高一些。此外,由于一次采集的指纹面积相对滑动式采集来说要小一些,就得多次采集,通过“拼凑”,拼出较大面积的指纹图像。这就必须仰仗先进的算法,用软件算法来弥补滑按压式采集获得的指纹面积相对偏小的问题,以保障识别的精确度。
​​​​​​​​​​​​​​​​在这里插入图片描述

第二步:指纹评估

在采集到指纹之后,然后对采集的指纹进行质量评估,如果质量不合格,会要求再采一次。如果合格则对图像进行增强和细化。

第三步:“提取“特征

经过处理后会依次对得到的二值化图、细化图和提取特征图。在获得比较清晰的图像后,就开始对其进行特征提取。经过特征提取将数据储存下来之后,就可以进行下一步的匹配工作了。

第四步:指纹匹配

在匹配中要注意一点,那就是由于同一个手指的两幅图像会因为手指的位移、偏转以及按压的力度不同而产生差异,这就要在匹配时进行校准,通过特征点集校准等方式保证指纹识别的准确性。

版本演变

指纹识别是在Android 6.0之后新增的功能,因此在使用的时候需要先判断用户手机的系统版本是否支持指纹识别。另外,实际开发场景中,使用指纹的主要场景有两种:

纯本地使用。即用户在本地完成指纹识别后,不需要将指纹的相关信息给后台。
与后台交互。用户在本地完成指纹识别后,需要将指纹相关的信息传给后台。
由于使用指纹识别功能需要一个加密对象(CryptoObject)该对象一般是由对称加密或者非对称加密获得。

指纹识别的API版本演进

在 Android 6.0(Android M Api23),Android 系统开放了指纹识别的api,存在于android.hardware.fingerprint包下,核心类是FingerprintManager,提供了基础的指纹识别的功能。但是需要注意的是,FingerprintManager在 Android 9.0(Android P Api28)做了 @Deprecated 标记,将被弃用。

后来,在android.support.v4.hardware.fingerprint包和 androidx.core.hardware.fingerprint包中,FingerprintManager升级为了 FingerprintManagerCompat,对功能进行了增强,也做了一些兼容性的处理,比如增加了系统版本号的判断,对指纹支持加密处理等。实际上阅读源码会发现,他的核心功能还是调用 FingerprintManager 实现的。

再之后,在 Android 9.0(Android P Api 28),Google 对生物识别进行了进一步增强,开放了以 BiometricPrompt 为核心的新 Api,存在于 androidx.biometric 包和android.hardware.biometrics包下,Google 在开发者文档中是这样解释的:

On devices running P and above, this will show a system-provided authentication prompt, using a device’s supported biometric (fingerprint, iris, face, etc).

大意是,在 Android P 及以上版本的系统中,BiometricPrompt 将展现一个由系统提供的验证提示,用于支持设备提供的生物识别,包括指纹、虹膜、面部等。

指纹识别的核心方法

mCancellationSignal = new CancellationSignal();
fingerprintManager.authenticate(new FingerprintManager.CryptoObject(cipher), mCancellationSignal, 0, new FingerprintManager.AuthenticationCallback() {

@Override
public void onAuthenticationError(int errorCode, CharSequence errString) {

if (!isSelfCancelled) {

errorMsg.setText(errString);
if (errorCode == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT) {

Toast.makeText(mActivity, errString, Toast.LENGTH_SHORT).show();
dismiss();
}
}
}

        @Override
        public void onAuthenticationHelp(int helpCode, CharSequence helpString) {
            errorMsg.setText(helpString);
        }

        @Override
        public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {
            FingerprintManager.CryptoObject cryptoObject = result.getCryptoObject();
            Cipher cipher1 = cryptoObject.getCipher();
            try {
                byte[] bytes = cipher1.doFinal();
                byte[] bytes1 = cipher.doFinal();
            } catch (BadPaddingException e) {
                e.printStackTrace();
            } catch (IllegalBlockSizeException e) {
                e.printStackTrace();
            }
            Toast.makeText(mActivity, "指纹认证成功", Toast.LENGTH_SHORT).show();
            mActivity.onAuthenticated();
        }

        @Override
        public void onAuthenticationFailed() {
            errorMsg.setText("指纹认证失败,请再试一次");

        }
    }, null);

校验指纹识别是否可用
private boolean supportFingerprint() {

if (Build.VERSION.SDK_INT < 23) {

Toast.makeText(this, “您的系统版本过低,不支持指纹功能”, Toast.LENGTH_SHORT).show();
return false;
} else {

KeyguardManager keyguardManager = getSystemService(KeyguardManager.class);
FingerprintManager fingerprintManager = getSystemService(FingerprintManager.class);
if (!fingerprintManager.isHardwareDetected()) {

Toast.makeText(this, “您的手机不支持指纹功能”, Toast.LENGTH_SHORT).show();
return false;
}
// else if (!keyguardManager.isKeyguardSecure()) {

// Toast.makeText(this, “您还未设置锁屏,请先设置锁屏并添加一个指纹”, Toast.LENGTH_SHORT).show();
// return false;
// }
else if (!fingerprintManager.hasEnrolledFingerprints()) {

Toast.makeText(this, “您至少需要在系统设置中添加一个指纹”, Toast.LENGTH_SHORT).show();
return false;
}
}
return true;
}

指纹识别的发展变化

上述的指纹识别主要讲述的就是传统的电容式指纹识别,而随着科技的发展,直至今天,市面上的指纹识别技术已经发展到大致三类:电容式指纹识别、光学屏幕指纹识别和超声波指纹识别。那接下来就分别来看看三大指纹识别技术的技术原理。

电容式指纹识别

首先,传统的电容式指纹识别技术我们应该都不陌生,全面屏手机时代没有来临之前,几乎所有的手机指纹识别技术都是电容式指纹识别。

电容式指纹识别技术应用发展多年,无论是识别速度还是准确性都很高,可以说已经相当成熟。其原理是利用硅晶圆在和我们皮肤上电解液接触的时候后形成电场,同时指纹在微观上是高低不平的(肉眼不可见),这时候传感器就可以记录下指纹的形状,以供解锁使用。
在这里插入图片描述

从电容式指纹识别原理我们可以得出,电容识别不能湿手解锁,以及无法隔着电场情况复杂的屏幕实现屏下指纹识别。想要将电容式指纹识别转移到屏下有着不小的困难,因为其穿透能力太差让它在全面屏时代显得格格不入。

虽然电容式指纹还可以选择后置和侧边识别,或者另辟蹊径把指纹识别镶嵌在品牌logo中,但顺应市场,屏下指纹识别才是未来的主流方向。

光学指纹识别

谈到光学识别的应用就很普遍了,简单的举例来说我们日常上下班的打卡机或门禁等,都采用了光学指纹识别技术,其原理是利用了光的折射和反射。

手指按压屏幕时,OLED屏幕发出光线将手指区域照亮,照亮指纹的反射光线透过屏幕像素的间隙返回到紧贴于屏下的传感器上。获取的指纹图像与手机初次录入的图像进行对比,最后进行识别判断。
在这里插入图片描述

另外,由于LCD屏幕无法自发光,所以目前支持光学屏下指纹识别的产品都采用的是OLED屏幕。而且OLED屏幕拥有的自发光、可弯曲,厚度薄等特性,是光学屏下指纹识别技术的有力支撑。

超声波指纹识别

既然是超声波指纹识别,那实现原理自然就离不开它了。超声波指纹识别与电容式指纹识别原理不同,因为超声波具有穿透性,指纹模组发出的特定频率的超声波扫描手指,利用指纹的不同对超声波反射的不同,能够建立3D图像。
在这里插入图片描述

高通称超声波指纹识别为Sense ID,它对手指表面的清洁程度没有太多要求。而且不用对屏幕面板进行开孔,无需按压、可以实现湿手解锁。但目前应用该技术的手机厂商并不是很多,三星的Galaxy系列旗舰算一个。

材料来源:

一文看懂三大指纹识别原理 光学屏幕指纹强在哪_腾讯新闻 (qq.com)

每天都用指纹解锁手机,你知道它的原理吗? – 知乎 (zhihu.com)

原文链接
https://mp.csdn.net/mp_blog/creation/editor/121705135

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/169473.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • [UML] 类图介绍 —— 程序员(灵魂画手)必备画图技能之一

    [UML] 类图介绍 —— 程序员(灵魂画手)必备画图技能之一统一建模语言(UnifiedModelingLanguage,UML)可分类成:功能模型:从用户的角度展示系统的功能,包括用例图。对象模型:采用对象,属性,操作,关联等概念展示系统的结构和基础,包括类别图、对象图。动态模型:展现系统的内部行为。包括序列图,活动图,状态图。类图说到类图,它包含的东西确实有点多,你去网上看总能看到,同样都是类图,但是好像各有各家的章法,总让人摸不着头脑。要么少个箭头要么实线变成虚线了… 那这个类图到底有没有标准呢?别慌,有的,《大话设.

  • C++动态库和静态库_动态库和静态库调用方法

    C++动态库和静态库_动态库和静态库调用方法1、前言从事软件工作也有两年了,C++静态库和动态库也用了不少,但都是依葫芦画瓢,一直没具体去研究一下二者的区别,加载方式等,今天花时间看了几篇博客,重新学习了一下,做出如下笔记。2、定义静态库和动态库从字面意思来看,区别就是静态和动态。而这里的静态和动态指的是库的链接阶段。可以看如下的编译过程。静态库:在链接阶段库将会与目标汇编后的目标文件.o一起打包生成可执行文件。成为可执行…

  • c++语言截取字符串,详解C++ string常用截取字符串方法

    c++语言截取字符串,详解C++ string常用截取字符串方法string常用截取字符串方法有很多,但是配合使用以下两种,基本都能满足要求:find(stringstrSub,npos);find_last_of(stringstrSub,npos);其中strSub是需要寻找的子字符串,npos为查找起始位置。找到返回子字符串首次出现的位置,否则返回-1;注:(1)find_last_of的npos为从末尾开始寻找的位置。(2)下文中用到的strs…

  • Java学习:assert(断言)的使用——测试程序和AssertionError错误事件

    Java学习:assert(断言)的使用——测试程序和AssertionError错误事件assert是在J2SE1.4中引入的新特性,assertion就是在代码中包括的布尔型状态,程序员认为这个状态是true。一般来说assert在开发的时候是检查程序的安全性的,在发布的时候通常都不使用assert。在1.4中添加了assert关键字

  • HDU ACM 4578 Transformation-&gt;段树-间隔的变化

    HDU ACM 4578 Transformation-&gt;段树-间隔的变化

  • 流数据_数据回流是什么意思

    流数据_数据回流是什么意思恢复内容开始特征:持续到达,数据量大,注重数据整体价值,数据顺序可能颠倒,丢失,实时计算,海量,分布,实时,快速部署,可靠linkedinKafkasparkstreaming:微小批

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号