浅谈安卓生物识别技术
**前言:**随着移动应用安全性需求的不断增长,生物识别技术已经成为了许多 Android 应用中不可或缺的功能。无论是用于应用解锁、支付验证还是敏感信息访问,生物识别认证(如指纹、面部识别等)都为用户提供了更安全、更便捷的身份验证方式。在 Android 中 biometric 是目前推荐的生物识别认证库,它为开发者提供了一个统一的接口来处理各种生物识别认证方法。本文简要讨论如何使用biometric,并通过代码实例展示如何在 Android 应用中实现生物识别认证功能。
一、什么是Biometric
androidx.biometric 是 Android Jetpack 提供的一个生物识别库,它通过简化的 API 让开发者可以轻松集成指纹、面部识别等生物识别技术。与 Android 系统本身的生物识别接口相比,androidx.biometric 提供了更高层次的抽象和更好的兼容性,支持跨设备和 Android 版本的生物识别认证。
核心优势
- 简化的api接口:提供了一致的 API,开发者无需关心底层的实现细节。
- 跨设备兼容性:通过 BiometricPrompt 类,应用可以在不同设备和操作系统版本中实现生物识别功能。
- 支持多种生物识别方式:包括指纹、面部识别和其他生物识别方式,具体支持的方式取决于设备。
三种生物识别验证类型
- BIOMETRIC_STRONG:强类型识别验证。使用 Android 兼容性定义页面上定义的 3 类生物识别技术进行身份验证,设备上满足或超过 Android CDD 定义的第 3 类(以前称为强类)要求的任何生物识别技术(例如指纹、虹膜或面部)。提供较高级别的安全性。
- BIOMETRIC_WEAK:弱类型识别验证。使用 Android 兼容性定义页面上定义的 3 类生物识别技术进行身份验证,设备上满足或超过 Android CDD 定义的第 2 类(以前称为弱类)要求的任何生物识别技术(例如指纹、虹膜或面部)。提供较低级别的安全性。
- DEVICE_CREDENTIAL:使用屏幕锁定凭据(即用户的 PIN 码、解锁图案或密码)进行身份验证。此方法不涉及生物识别
二、核心API以及常用类
在 androidx.biometric 中,最常用的类是 BiometricPrompt,它提供了启动生物识别认证的主要接口。此外,还有一些辅助类和方法,用于定制提示信息和处理认证结果。
1.接口
接口 | 描述 |
---|---|
BiometricManager.Authenticators | 验证器类型 |
PromptContentView | 包含生物识别提示的内容视图模板的信息 |
PromptContentItem | 在PromptContentView上显示的项目 |
2.类
类 | 描述 |
---|---|
BiometricManager | 提供与生物识别相关的系统信息(例如指纹、人脸等)的类 |
BiometricManager.Strings | 为用于对用户进行身份验证的应用程序提供本地化字符串 |
BiometricPrompt | 用于管理系统提供的生物识别提示的一个类 |
BiometricPrompt.AuthenticationCallback | 在身份验证期间可调用的方法集合 |
BiometricPrompt.AuthenticationResult | 用户成功通过身份验证时传递给 onAuthenticationSucceeded 的数据的容器 |
BiometricPrompt.CryptoObject | 由 BiometricPrompt 支持的加密对象的包装器类 |
BiometricPrompt.PromptInfo | 一组可配置的选项,用于 BiometricPrompt 的显示和行为方式。 |
BiometricPrompt.PromptInfo.Builder | 用于为 PromptInfo 类设置各个选项的生成器 |
PromptContentItemBulletedText | 在 PromptVerticalListContentView 上显示项目符号文本的列表项 |
PromptContentViewWithMoreOptionsButton | 包含内容视图模板的信息,其中包含 Biometric Prompt 的更多选项按钮 |
PromptContentViewWithMoreOptionsButton.Builder | 用于为 PromptContentViewWithMoreOptionsButton 类设置各个选项的生成器 |
PromptVerticalListContentView | 包含生物识别提示的垂直列表内容视图模板的信息 |
PromptVerticalListContentView.Builder | 用于为 PromptVerticalListContentView 类设置各个选项的生成器 |
三、交互
在 Android 中,生物识别的系统对话框(通过 BiometricPrompt 提供)是用于向用户请求进行生物识别认证(如指纹、面部识别或虹膜扫描)的界面。这个对话框由系统控制,以确保生物识别认证界面在所有设备上具有一致的外观和行为,增强用户的信任感和安全性。
典型特点
-
统一的外观与行为
- 系统生物识别对话框的样式是由 Android 系统自动管理的,具体外观取决于设备的 Android 版本、厂商定制的 UI(如 MIUI、One UI 等)以及设备的硬件特性。通常,它会以简单、直观的方式展示。
- 系统会根据设备上可用的生物识别技术(如指纹、面部识别等)自动切换认证方式。
-
对话框组件
-
标题(Title):通常是“验证身份”或类似的文本。
-
副标题(Subtitle):如果设置了副标题,显示在标题下方,常见的副标题为“请验证您的指纹”或“请查看摄像头进行面部识别”。
-
认证进度指示器:例如,指纹认证时,指纹图标可能会有动画效果,显示“扫描中”状态。面部识别时,会显示一个摄像头图标并提示用户面向摄像头。
-
取消(NegativeButton):退出生物识别对话框
-
认证成功或失败的反馈:当认证成功时,会有提示用户“认证成功”;当认证失败时,会显示“认证失败”,并要求重新进行尝试。
下面是一个对话框组件的展示:
-
-
认证方式的选择
- 指纹:如果设备支持指纹传感器,用户会看到一个指纹图标,并提示他们将手指放在指纹传感器上。
- 面部识别:如果设备支持面部识别,用户会看到摄像头图标,并提示他们面对摄像头进行认证。
- 虹膜扫描(在某些设备上可用):如果设备支持虹膜扫描,可能会显示相关提示。
-
自动适应设备功能
系统会自动检测设备上支持的生物识别方式,并根据设备特性选择最佳认证方式。例如,如果设备有指纹传感器,系统会优先提供指纹认证;如果设备支持面部识别,系统会显示面部识别界面。
四、动手实现
下面是使用 biometric 技术实现指纹验证的简单实例
-
创建一个简单的xml页面,设置一个按钮,由于不是本文的核心部分,只展示代码
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center" android:padding="16dp"> <Button android:id="@+id/authenticate_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="使用生物识别验证" /> </LinearLayout>
-
实现 biometric 生物验证
-
创建 BiometricPrompt 实例
// 初始化BiometricPrompt和Executor Executor executor = ContextCompat.getMainExecutor(this); biometricPrompt = new BiometricPrompt(this, executor, new BiometricPrompt.AuthenticationCallback() { @Override public void onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result) { super.onAuthenticationSucceeded(result); Toast.makeText(MainActivity.this, "认证成功!", Toast.LENGTH_SHORT).show(); } @Override public void onAuthenticationFailed() { super.onAuthenticationFailed(); Toast.makeText(MainActivity.this, "认证失败!", Toast.LENGTH_SHORT).show(); } @Override public void onAuthenticationError(int errorCode, CharSequence errString) { super.onAuthenticationError(errorCode, errString); Toast.makeText(MainActivity.this, "认证错误: " + errString, Toast.LENGTH_SHORT).show(); } });
biometricPrompt 是一个 BiometricPrompt 对象,它处理生物识别认证的整个流程。构造 BiometricPrompt 时,需要传入:
- 当前的 Context(即 MainActivity)。
- Executor,用于确保回调在主线程上执行。
- AuthenticationCallback,用于处理认证成功和失败的回调。
在回调中:
- onAuthenticationSucceeded():认证成功时,显示一个短暂的 Toast 提示 “认证成功”。
- onAuthenticationFailed():认证失败时,显示一个 Toast 提示 “认证失败”。
- onAuthenticationError():认证错误时,显示一个 Toast 提示 “认证错误”,并返回错误类型
-
配置认证提示信息
//配置认证提示信息 BiometricPrompt.PromptInfo promptInfo = new BiometricPrompt.PromptInfo.Builder() .setTitle("指纹认证") .setSubtitle("请使用指纹验证身份") .setNegativeButtonText("取消") .build();
PromptInfo 是一个用于设置认证提示界面的类,它通过 Builder 模式来配置。这里的设置包括:
- setTitle():设置认证框的标题,提示用户进行指纹认证。
- setSubtitle():设置认证框的副标题,进一步提示用户验证身份。
- setNegativeButtonText():设置认证框的负面按钮文本,取消认证。
PromptInfo 配置好之后,使用 .build() 方法构建出最终的认证信息。
-
设置认证按钮点击事件,启动认证
authenticateButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { biometricPrompt.authenticate(promptInfo); } });
-
完整代码
package com.example.usermanage; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import androidx.biometric.BiometricPrompt; import androidx.core.content.ContextCompat; import java.util.concurrent.Executor; public class MainActivity extends AppCompatActivity { private BiometricPrompt biometricPrompt; private BiometricPrompt.PromptInfo promptInfo; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button authenticateButton = findViewById(R.id.authenticate_button); // 初始化BiometricPrompt和Executor Executor executor = ContextCompat.getMainExecutor(this); biometricPrompt = new BiometricPrompt(this, executor, new BiometricPrompt.AuthenticationCallback() { @Override public void onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result) { super.onAuthenticationSucceeded(result); Toast.makeText(MainActivity.this, "认证成功!", Toast.LENGTH_SHORT).show(); } @Override public void onAuthenticationFailed() { super.onAuthenticationFailed(); Toast.makeText(MainActivity.this, "认证失败!", Toast.LENGTH_SHORT).show(); } @Override public void onAuthenticationError(int errorCode, CharSequence errString) { super.onAuthenticationError(errorCode, errString); Toast.makeText(MainActivity.this, "认证错误: " + errString, Toast.LENGTH_SHORT).show(); } }); // 配置认证提示信息 (PromptInfo) promptInfo = new BiometricPrompt.PromptInfo.Builder() .setTitle("生物识别认证") .setSubtitle("请验证您的身份") .setNegativeButtonText("取消") .build(); // 设置认证按钮点击事件 authenticateButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { biometricPrompt.authenticate(promptInfo); } }); } }
-
实现效果:
-
可以看到程序运行成功,能够正确调用生物识别技术进行也验证,也能通过toast返回信息
由于系统限制涉及身份验证界面的截屏,故拍屏,因此展示效果较差,请见谅
可以看到在笔者个人使用的物理机上有同样的效果,且展示的对话框虽呈现 vivo 的 origin OS 的风格,但对话框的内容仍然由Title, Subtitle, NegativeButton, 以及指纹识别框,生物识别认证界面在所有设备上具有一致的外观和行为,增强用户的信任感和安全性。
五、比较
1.androidx.biometric vs FingerprintManager
在biomertic推出前,android系统通过FingerprintManager来实现生物识别功能,与已被弃用的FingerprintManager相比,biometric存在如下优势
- 推荐使用:FingerprintManager 在 Android 9 以后被弃用,取而代之的是 androidx.biometric。androidx.biometric 不仅支持指纹,还支持面部识别和其他生物识别方式,而 FingerprintManager 仅限于指纹。
- API 简化:androidx.biometric API 设计更加现代化和简洁,减少了开发者的负担,特别是在处理生物识别认证流程时。
2.androidx.biometric
androidx.biometric 是 AndroidX 库的一部分,它提供了一个现代化、标准化的接口,用于访问和使用设备上的生物识别功能(如指纹、面部识别等)。这个库在 Android 9(Pie)及更高版本中提供了统一的 API,旨在简化开发者集成生物识别认证的工作。
主要功能:
- BiometricPrompt:用于生物识别认证的主接口,支持指纹、面部识别、虹膜等。
- BiometricManager:提供关于设备是否支持生物识别功能的信息。
- 兼容性:androidx.biometric 库确保了不同 Android 版本和设备的一致性,简化了开发过程。
关键优势:
- API 统一性:无论设备支持的是哪种生物识别方式,BiometricPrompt 都可以提供一个一致的 API 接口。
- 向后兼容:支持较旧的 Android 版本(如 Android 6.0 以上)。
- 简化认证过程:通过 BiometricPrompt,开发者无需关心底层实现,专注于认证流程。
3.android.hardware.biometric
android.hardware.biometrics 是 Android 系统层的一个 API,提供了底层接口,供硬件设备和驱动程序直接访问生物识别功能(如指纹传感器、面部识别模块等)。这是 Android 系统底层的硬件接口,通常由设备制造商实现和提供。
它并不直接面向应用开发者,而是通过 androidx.biometric 提供的高层接口间接使用。也就是说,应用开发者通常不直接使用 android.hardware.biometrics,而是通过 androidx.biometric 来调用该接口。设备的生物识别硬件实现通过 android.hardware.biometrics 来操作,例如与指纹传感器进行通信、处理数据等。
4.关系:
- androidx.biometric 是一个高级 API,它封装了 android.hardware.biometrics 提供的底层功能,简化了开发者的使用。
- android.hardware.biometrics 提供的是设备层级的生物识别硬件接口,androidx.biometric 通过它来与硬件交互。
- 开发者通常不会直接使用 android.hardware.biometrics,而是使用 androidx.biometric,这是因为 androidx.biometric 提供了更高层次的封装,支持多个设备和 Android 版本。
5.简单总结:
- androidx.biometric:提供跨设备和跨版本兼容的 API,简化生物识别认证的实现。
- android.hardware.biometrics:是底层硬件接口,提供对设备生物识别传感器的直接访问。
开发者只需使用 androidx.biometric,系统会自动处理与硬件接口的交互,因此应用开发者通常不需要直接与 android.hardware.biometrics 打交道。
六、结语
androidx.biometric 是 Android 开发中实现生物识别身份验证的推荐方式。它提供了更为简洁、统一的 API,使得开发者可以更容易地集成指纹、面部识别等技术。通过本文的介绍和代码示例,可以轻松地在 Android 应用中实现安全的生物识别认证功能。
与旧版的 FingerprintManager 和底层的 android.hardware.biometrics API 相比,androidx.biometric 提供了更好的兼容性和扩展性,是现代 Android 应用开发中实现生物识别认证的最佳选择。
开发者通常不需要直接与 android.hardware.biometrics 打交道。