我是靠谱客的博主 粗暴大雁,最近开发中收集的这篇文章主要介绍浅谈Android指纹识别技术,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

最后

以上就是粗暴大雁为你收集整理的浅谈Android指纹识别技术的全部内容,希望文章能够帮你解决浅谈Android指纹识别技术所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部