Flutter 指纹识别

在这篇博客中,我们将介绍如何使用 Flutter 的 local_auth 插件在 Android 和 iOS 设备上实现指纹识别功能。通过这一步一步的实现,我们将学习如何检查设备是否支持生物识别、如何触发指纹验证,并处理可能出现的错误。

效果图(因为录屏时系统不能录制指纹页面,所以黑屏;实际跑起来是正常的:

1. 安装 local_auth 插件

插件地址:https://pub.dev/packages/local_auth

在 pubspec.yaml 文件中添加了 local_auth 插件依赖:

dependencies:flutter:sdk: flutterlocal_auth: ^2.1.3

2. 修改 Android 配置

2.1 在 AndroidManifest.xml 文件中添加权限,以允许应用访问生物识别硬件:

<uses-permission android:name="android.permission.USE_BIOMETRIC"/>
<uses-permission android:name="android.permission.USE_FINGERPRINT"/>

2.2 MainActivity 继承自 FlutterFragmentActivity,并且注册插件引擎

package com.example.test1import io.flutter.embedding.android.FlutterFragmentActivity;
import io.flutter.plugins.GeneratedPluginRegistrant
import io.flutter.embedding.engine.FlutterEngineclass MainActivity: FlutterFragmentActivity() {override fun configureFlutterEngine(flutterEngine: FlutterEngine) {GeneratedPluginRegistrant.registerWith(flutterEngine)}
}

2.3 在android/app/src/main/res/values/styles.xml 文件下这样改:

<style name="LaunchTheme" parent="Theme.AppCompat.DayNight">

3. 实现指纹识别功能

接下来,我们编写 Flutter 代码,使用 local_auth 插件实现指纹识别。我们的应用将包含以下功能:

  1. 检查设备是否支持指纹识别。
  2. 在支持指纹识别的设备上执行身份验证。

以下是主要的 Flutter 代码:

import 'dart:io';import 'package:flutter/material.dart';
import 'package:local_auth/local_auth.dart';
import 'package:flutter/services.dart';
import 'package:local_auth_ios/local_auth_ios.dart';
import 'package:local_auth_android/local_auth_android.dart';void main() {runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({super.key});@overrideWidget build(BuildContext context) {return MaterialApp(title: '指纹识别 Demo',theme: ThemeData(primarySwatch: Colors.blue,),home: const FingerprintDemo(),);}
}class FingerprintDemo extends StatefulWidget {const FingerprintDemo({super.key});@override_FingerprintDemoState createState() => _FingerprintDemoState();
}class _FingerprintDemoState extends State<FingerprintDemo> {final LocalAuthentication auth = LocalAuthentication();String _message = "请点击按钮进行指纹识别";bool haveFingerprint = false;// 检查设备是否支持生物识别--手机必须要设置密码和开启指纹功能Future<void> _checkBiometricSupport() async {haveFingerprint = await isSupportBiometric();setState(() {if (haveFingerprint) {_message = "设备支持指纹识别";} else {_message = "该设备不支持指纹识别";}});}// 尝试进行指纹识别Future<void> _authenticateWithFingerprint() async {try {bool authenticated = await auth.authenticate(localizedReason: ' ',authMessages: [const AndroidAuthMessages(biometricHint: '扫描指纹进行身份验证',cancelButton: '取消',signInTitle: '指纹验证',),const IOSAuthMessages(lockOut: '验证身份失败,请重新验证',cancelButton: '取消',)],options: const AuthenticationOptions(useErrorDialogs: false,biometricOnly: true,));setState(() {if (authenticated) {_message = "指纹验证成功";} else {_message = "指纹验证失败";}});} on PlatformException catch (e) {setState(() {_message = "错误: ${e.message}";});}}isSupportBiometric() async {late List<BiometricType> availableBiometrics;try {availableBiometrics = await auth.getAvailableBiometrics();print(availableBiometrics);if (availableBiometrics.isNotEmpty) {if (Platform.isIOS) {if (availableBiometrics.contains(BiometricType.fingerprint)) {return true;}} else {return true;}}} on PlatformException catch (e) {availableBiometrics = <BiometricType>[];print(e);}return false;}@overridevoid initState() {super.initState();_checkBiometricSupport();  // 启动时检查设备支持情况}@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text("指纹识别 Demo"),),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[Text(_message,style: const TextStyle(fontSize: 20),),const SizedBox(height: 20),ElevatedButton(onPressed: _authenticateWithFingerprint,child: const Text("使用指纹验证"),),],),),);}
}

4.代码解析

注意:只有手机设置了密码和开启了指纹功能才可以用这个功能

  1. _checkBiometricSupport:首先检查设备是否支持指纹识别。通过调用 auth.getAvailableBiometrics() 来获取设备支持的生物识别类型。如果设备支持指纹识别或面部识别,将更新 _message

  2. _authenticateWithFingerprint:触发指纹验证。如果设备支持并且用户点击按钮,应用会弹出指纹识别对话框,并根据用户的验证结果更新 _message

  3. isSupportBiometric:通过调用 auth.getAvailableBiometrics() 来获取设备支持的生物识别类型。如果设备支持指纹或面部识别,返回 true

  4. AuthenticationOptions:配置 local_auth 插件的一些选项,如禁用默认的错误对话框(useErrorDialogs: false)和只允许使用生物识别进行验证(biometricOnly: true)。

总结

通过本文,我们介绍了如何使用 local_auth 插件实现 Flutter 应用中的指纹识别功能。通过设置合适的配置和调用插件提供的 API,你可以轻松地在 Android 和 iOS 设备上实现生物识别验证功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/62723.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CentOS 9 配置静态IP

文章目录 1_问题原因2_nmcli 配置静态IP3_使用配置文件固定IP4_重启后存在的问题5_nmcli 补充 1_问题原因 CentOS 7 于 2014年6月发布&#xff0c;基于 RHEL 7&#xff0c;并在 2024年6月30日 结束维护。 CentOS 9 作为目前的最新版本&#xff0c;今天闲来闲来无事下载下来后…

数据结构(三)——双向链表的介绍以及实现

前言 前面两期数据结构的文章我们介绍了顺序表和单向链表&#xff0c;那么本篇博文我们将来了解双向链表&#xff0c;作为最好用的一种链表&#xff0c;双向链表有什么特殊之处呢&#xff0c;接下来就让我们一起了解一下吧。 下面是前两篇数据结构的文章&#xff1a; 数据结…

Oracle--表空间Tablespace

在 Oracle 数据库中&#xff0c;表空间&#xff08;Tablespace&#xff09; 是一种逻辑存储结构&#xff0c;用于组织和管理数据库中物理存储数据文件的方式。以下是表空间相关操作的详细介绍&#xff0c;包括创建、修改、删除、查询以及常见问题处理。 1. 表空间的作用 提供逻…

cmake一些常用指令

cmake常用的一些命令 推荐网址&#xff1a;CMake 保姆级教程&#xff08;上&#xff09; | 爱编程的大丙 cmake_minimum_required(VERSION 3.0) project(CALC) # 增加-stdc11 set(CMAKE_CXX_STANDARD 11) # 指定输出的路径 set(HOME ${CMAKE_CURRENT_SOURCE_DIR}) # 可执行文…

面阵相机的使用和注意事项

引言 面阵相机&#xff08;Area Scan Camera&#xff09;是一种广泛应用于工业视觉、医学成像、安防监控以及科研领域的图像采集设备。与线扫相机不同&#xff0c;面阵相机的传感器包含多行像素&#xff08;例如1280x1024、1920x1080等&#xff09;&#xff0c;能够在一个曝光…

损失函数分类

1. NLLLoss&#xff08;负对数似然损失&#xff09; 定义&#xff1a; 直接对预测的概率 p(yi) 的负对数求平均。通常配合 Softmax 使用&#xff0c;输入为对数概率。 优点&#xff1a; 对离散分类问题效果良好。更灵活&#xff0c;用户可以自行计算 Softmax。 缺点&#x…

python冒号是什么意思

例如&#xff1a; user: User User.objects.filter(iddata.get(uid)).first() 变量名后面的冒号是&#xff1a;类型注解&#xff0c;3.6以后加入的&#xff0c;冒号右边是类型&#xff0c;仅仅是注释&#xff0c;有些鸡肋。 变量注释的语法&#xff1a;注释变量类型,明确指出…

ESLint v9.0.0 新纪元:探索 eslint.config.js 的奥秘 (4)

从 v9.0.0 开始&#xff0c;官方推荐的配置文件格式是 eslint.config.js&#xff0c;并且支持 ESM 模块化风格&#xff0c;可以通过 export default 来导出配置内容。 // eslint.config.js export default [{rules: {semi: "error","prefer-const": "…

【Vue3】【Naive UI】< a >标签

【Vue3】【Naive UI】< a >标签 超链接及相关属性其他属性 【VUE3】【Naive UI】&#xff1c;NCard&#xff1e; 标签 【VUE3】【Naive UI】&#xff1c;n-button&#xff1e; 标签 【VUE3】【Naive UI】&#xff1c;a&#xff1e; 标签 <a> 标签HTML中的一个锚&…

打字指法和键盘按键功能简介

打字指法和键盘按键功能简介 一、打字指法简介&#xff08;附视频演示&#xff09; 基本要领和练习步骤&#xff1a; 手指位置&#xff1a;正常情况下&#xff0c;大拇指放在空格键上&#xff0c;其余四个手指分别放在 ASDF 和 JKL; 键上。 打字姿势&#xff1a;打字时手指…

H3C ACL实验

实验拓扑 实验需求 按照图示配置 IP 地址全网路由互通在 SERVER1 上配置开启 TELNET 和 FTP 服务配置 ACL 实现如下效果 192.168.1.0/24网段不允许访问 192.168.2.0/24 网段&#xff0c;要求使用基本 ACL 实现 PC1 可以访问 SERVER1 的 TELNET 服务&#xff0c;但不能访问 FTP…

【热门主题】000077 物联网智能项目:开启智能未来的钥匙

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【热…

网络安全-网络安全审计

网络安全审计是为了确保网络系统的安全性和完整性&#xff0c;防范潜在的网络攻击和数据泄露风险。 审计步骤&#xff1a; 1.确定审计目标&#xff1a;明确审计的目的和范围&#xff0c;例如审计网络设备、服务器、应用程序或数据库等。 2.收集信息&#xff1a;收集审计范围…

AIGC时代 | 如何从零开始学网页设计及3D编程

文章目录 一、网页设计入门1. 基础知识2. 学习平台与资源3. 示例代码&#xff1a;简单的HTMLCSSJavaScript网页 二、3D编程入门1. 基础知识2. 学习平台与资源3. 示例代码&#xff1a;简单的Unity 3D游戏 《编程真好玩&#xff1a;从零开始学网页设计及3D编程》内容简介作者简介…

Java并发07之ThreadLocal

文章目录 1 ThreadLocal原理2 内部结构3 内存泄露问题4 entry的key为什么被设计为弱引用 1 ThreadLocal原理 ThreadLocal类用来提供线程内部的局部变量。这种变量在多线程环境下访问时能保证各个线程的变量相对独立于其他线程内的变量。ThreadLocal实例通常来说都是private st…

Redis设计与实现第17章 -- 集群 总结1(节点 槽指派)

集群通过分片sharding来进行数据共享&#xff0c;并提供复制和故障转移功能。 17.1 节点 一个Redis集群通常由多个节点node组成&#xff0c;刚开始每个节点都是相互独立的&#xff0c;必须将各个独立的节点连接起来&#xff0c;才能构成一个包含多个节点的集群。通过CLUSTER …

HarmonyOS4+NEXT星河版入门与项目实战(25)------UIAbility启动模式(文档编辑案例)

文章目录 1、启动模式2、Specified启动模式实现步骤3、文档编辑案例1、文件创建2代码实现3、Statge 创建4、添加配置1、启动模式 Singleton启动模式: 每个 UIAbility 只存在一个实例,是默认的启动模式,任务列表中只会存在一个相同的 UIAbilityStandard启动模式: 每次启动 U…

python股票数据分析(Pandas)练习

需求&#xff1a; 使用pandas读取一个CSV文件&#xff0c;文件内容包括股票名称、价格和交易量。完成以下任务&#xff1a; 找出价格最高的股票&#xff1b; 计算总交易量&#xff1b; 绘制价格折线图。 代码实现&#xff1a; import pandas as pd import matplotlib.pyplot …

【软考速通笔记】系统架构设计师⑨——软件可靠性基础知识

文章目录 一、前言二、软件可靠性基础概念三、软件可靠性建模方法四、软件可靠性设计4.1 容错设计4.2 检错设计4.3 降低复杂度设计4.4 系统配置设计 五、软件可靠性测试 一、前言 笔记目录大纲请查阅&#xff1a;【软考速通笔记】系统架构设计师——导读 二、软件可靠性基础概念…

鸿蒙NEXT元服务:论如何免费快速上架作品

【引言】天下武功&#xff0c;唯快不破。 本文讨论如何免费且以最快速度上架自己的作品。 作者以自己从零开始到提交发布审核一共俩小时的操作流程分享给大家作参考。 【1】立项选择 结论&#xff1a;元服务&#xff0c;单机&#xff0c;工具类&#xff08;非游戏&#xff…