首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

浅谈安卓生物识别技术

  • 25-02-19 08:41
  • 4147
  • 5742
blog.csdn.net

浅谈安卓生物识别技术

**前言:**随着移动应用安全性需求的不断增长,生物识别技术已经成为了许多 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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  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();
                  }
              });
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22

      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();
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

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

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

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

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

      authenticateButton.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              biometricPrompt.authenticate(promptInfo);
          }
      });
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
    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);
                  }
              });
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
      • 51
      • 52
      • 53
      • 54
      • 55
      • 56
      • 57
      • 58
      • 59
      • 60
      • 61
      • 62
      • 63
    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 打交道。

注:本文转载自blog.csdn.net的nayuta436的文章"https://blog.csdn.net/m0_75279735/article/details/144520035"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

105
移动开发
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top