浅谈安卓生物识别技术

浅谈安卓生物识别技术

**前言:**随着移动应用安全性需求的不断增长,生物识别技术已经成为了许多 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 提供)是用于向用户请求进行生物识别认证(如指纹、面部识别或虹膜扫描)的界面。这个对话框由系统控制,以确保生物识别认证界面在所有设备上具有一致的外观和行为,增强用户的信任感和安全性。

典型特点

  1. 统一的外观与行为

    • 系统生物识别对话框的样式是由 Android 系统自动管理的,具体外观取决于设备的 Android 版本、厂商定制的 UI(如 MIUI、One UI 等)以及设备的硬件特性。通常,它会以简单、直观的方式展示。
    • 系统会根据设备上可用的生物识别技术(如指纹、面部识别等)自动切换认证方式。
  2. 对话框组件

    • 标题(Title):通常是“验证身份”或类似的文本。

    • 副标题(Subtitle):如果设置了副标题,显示在标题下方,常见的副标题为“请验证您的指纹”或“请查看摄像头进行面部识别”。

    • 认证进度指示器:例如,指纹认证时,指纹图标可能会有动画效果,显示“扫描中”状态。面部识别时,会显示一个摄像头图标并提示用户面向摄像头。

    • 取消(NegativeButton):退出生物识别对话框

    • 认证成功或失败的反馈:当认证成功时,会有提示用户“认证成功”;当认证失败时,会显示“认证失败”,并要求重新进行尝试。

      下面是一个对话框组件的展示:
      在这里插入图片描述

  3. 认证方式的选择

    • 指纹:如果设备支持指纹传感器,用户会看到一个指纹图标,并提示他们将手指放在指纹传感器上。
    • 面部识别:如果设备支持面部识别,用户会看到摄像头图标,并提示他们面对摄像头进行认证。
    • 虹膜扫描(在某些设备上可用):如果设备支持虹膜扫描,可能会显示相关提示。
  4. 自动适应设备功能

    系统会自动检测设备上支持的生物识别方式,并根据设备特性选择最佳认证方式。例如,如果设备有指纹传感器,系统会优先提供指纹认证;如果设备支持面部识别,系统会显示面部识别界面。

四、动手实现

下面是使用 biometric 技术实现指纹验证的简单实例

  1. 创建一个简单的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>
    
  2. 实现 biometric 生物验证

    1. 创建 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 提示 “认证错误”,并返回错误类型
    2. 配置认证提示信息

      //配置认证提示信息
      BiometricPrompt.PromptInfo promptInfo = new BiometricPrompt.PromptInfo.Builder()
              .setTitle("指纹认证")
              .setSubtitle("请使用指纹验证身份")
              .setNegativeButtonText("取消")
              .build();
      

      PromptInfo 是一个用于设置认证提示界面的类,它通过 Builder 模式来配置。这里的设置包括:

      • setTitle():设置认证框的标题,提示用户进行指纹认证。
      • setSubtitle():设置认证框的副标题,进一步提示用户验证身份。
      • setNegativeButtonText():设置认证框的负面按钮文本,取消认证。

      PromptInfo 配置好之后,使用 .build() 方法构建出最终的认证信息。

    3. 设置认证按钮点击事件,启动认证

      authenticateButton.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              biometricPrompt.authenticate(promptInfo);
          }
      });
      
    4. 完整代码

      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);
                  }
              });
          }
      }
      
    5. 实现效果:

      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

在这里插入图片描述
可以看到程序运行成功,能够正确调用生物识别技术进行也验证,也能通过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 打交道。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值