浅谈Android指纹识别技术

2023-05-16

浅谈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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

浅谈Android指纹识别技术 的相关文章

  • Firebase Analytics 禁用受众国家/地区跟踪

    我正在开发一个严格不允许位置跟踪的应用程序 我想使用 Firebase Analytic 的其他功能 例如 PageTransitions 和 Crashalitics 但如果我无法禁用受众位置跟踪 我就无法使用其中任何功能 这是我在 An
  • Phonegap - 如何将.txt文件保存在Android手机的根目录中

    我正在尝试使用phonegap 将 txt 文件保存在Android 手机的根目录中 我已经安装了这些插件 cordova plugin file 和 cordova plugin file transfer 在 config xml 文件
  • Android:“dp”到“px”转换?

    我正在读这篇文章 http developer android com guide practices screens support html http developer android com guide practices scre
  • RxJava、Proguard 和 sun.misc.Unsafe

    我有以下问题RxJava 1 1 0 使用时Proguard 我没有更改 RxJava 版本或其 pro文件 但更新后OkHttp我无法编译使用Proguard因为我有关于sun misc Unsafe不在场 rxJava pro keep
  • 接近语法错误(代码1)插入Android SQLite

    我正在创建一个通讯录应用程序 用户可以在其中输入姓名 电子邮件地址和号码 我希望将此数据保存在数据库中 但我似乎无法使插入方法起作用 我收到的错误是 android database sqlite SQLiteException near
  • Android Studio 在编译时未检测到支持库

    由于 Android Studio 将成为 Android 开发的默认 IDE 因此我决定将现有项目迁移到 Android studio 中 项目结构似乎不同 我的项目中的文件夹层次结构如下 Complete Project gt idea
  • Android Studio:无法启动守护进程

    当我尝试在 Android Studio 中导入 gradle 项目时 遇到以下错误 Unable to start the daemon process This problem might be caused by incorrect
  • Android构建apk:控制MANIFEST.MF

    Android 构建 APK 假设一个 apk 包含一个库 jar 例如 foo jar 该库具有 META INF MANIFEST MF 这对于它的运行很重要 但在APK中有一个包含签名数据的MANIFEST MF 并且lib jar
  • Android Webview 图像未加载

    我制作了一个简单的应用程序WebView 但有些图片无法加载 正确 在我的电脑上 错误 在模拟器中 Correct 错误 没有横幅 于是我用Chrome debug进行调试 发现我的代码被改变了 我不添加像noscript or style
  • 材质设计图标颜色

    应该是哪种颜色 暗 材质图标 在官方文档上 https www google com design spec style icons html icons system icons https www google com design s
  • 如何创建像谷歌位置历史记录一样的Android时间轴视图?

    我想设计像谷歌位置历史这样的用户界面 我必须为我正在使用的应用程序复制此 UIRecyclerView 每行都是水平的LinearLayout其中包含右侧的图标 线条和视图 该线是一个FrameLayout具有圆形背景和半透明圆圈Views
  • 下载后从谷歌照片库检索图像

    我正在发起从图库中获取照片的意图 当我在图库中使用 Nexus 谷歌照片应用程序时 一切正常 但如果图像不在手机上 在 Google Photos 在线服务上 它会为我下载 选择图像后 我将图像发送到另一个活动进行裁剪 但在下载的情况下 发
  • 当手机旋转(方向改变)时如何最好地重新创建标记/折线

    背景 开发一个使用 Android Google Map v2 的本机 Android 应用程序 使用android support v4 app FragmentActivity 在 Android v2 2 上运行 客观的 在更改手机方
  • Android中webview的截图方法

    我在 webview 中的 html5 canvas 上画了一些线 并尝试使用下面的代码截取 webview 的屏幕截图 WebView webView WebView findViewById R id webview webView s
  • SharedFlow 和 StateFlow 的主要区别

    两者有什么区别共享流 and 状态流 以及如何使用这些MVI建筑学 使用简单更好吗Flow或者这些作为状态和事件 Flow 是冷的 意味着它仅在收集数据时才发出数据 另外Flow不能保存数据 可以把它看成是水在里面流动的管道 Flow中的数
  • 如何将图像从 Android 应用程序上传到网络服务器的特定文件夹中

    如何将图像从 android 移动到 Web 服务器上的指定文件夹 这是我的安卓代码 package com example bitmaptest import java io ByteArrayOutputStream import ja
  • 为什么Android的ImageReader类这么慢?

    我尝试了适用于 Android 3 4 1 的全新 OpenCVJavaCamera2View但它太慢了 仅显示相机视图约 15 fps 当我尝试较旧的JavaCameraView相反 它给了我很好的结果 30fps 这是我相机的极限 我想
  • 在 Android 中,如何将字符串从 Activity 传递到 Service?

    任何人都可以告诉如何将字符串或整数从活动传递到服务 我试图传递一个整数 setpossition 4 但它不需要 启动时总是需要 0 Service 我不知道为什么我不能通过使用 Service 实例从 Activity 进行操作 publ
  • 无法运行我的应用程序,要求选择 Android SDK

    今天我已经安装了Android Studio 金丝雀 1 现在我无法运行我的应用程序 将出现以下对话框 我已经通过 文件 gt 项目结构 gt Android SDK 位置 设置了正确的 SDK 位置 期待您的帮助来解决这个问题 警告对话框
  • 在 Google 地图上绘制线条/路径

    我很长一段时间都在忙于寻找如何在 HelloMapView 中的地图上的两个 GPS 点之间画一条线 但没有运气 谁能告诉我该怎么做 假设我使用扩展 MapView 的 HelloMapView 我需要使用叠加层吗 如果是这样 我是否必须重

随机推荐