Flutter 指纹识别

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

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

1. 安装 local_auth 插件

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

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

dependencies:
  flutter:
    sdk: flutter
  local_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.test1

import io.flutter.embedding.android.FlutterFragmentActivity;
import io.flutter.plugins.GeneratedPluginRegistrant
import io.flutter.embedding.engine.FlutterEngine

class 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});

  @override
  Widget 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;
  }

  @override
  void initState() {
    super.initState();
    _checkBiometricSupport();  // 启动时检查设备支持情况
  }

  @override
  Widget 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 设备上实现生物识别验证功能。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

不建模,无代码,如何快速搭建VR虚拟展厅?

不建模、无代码搭建虚拟展厅&#xff0c;可以借助一些专业的虚拟展厅搭建平台或工具来实现。以下是一些具体的步骤和建议&#xff1a; 一、选择平台或工具 首先&#xff0c;需要选择一个适合的平台或工具来搭建虚拟展厅。这些平台通常提供预设的展厅模板、拖拽式编辑工具和丰富…

网络空间安全之一个WH的超前沿全栈技术深入学习之路(13-3)白帽必经之路——如何用Metasploit 渗透到她的心才不会让我释怀

欢迎各位彦祖与热巴畅游本人专栏与博客 你的三连是我最大的动力 以下图片仅代表专栏特色 [点击箭头指向的专栏名即可闪现] 专栏跑道一 ➡️网络空间安全——全栈前沿技术持续深入学习 专栏跑道二 ➡️ 24 Network Security -LJS ​ ​ ​ 专栏跑道三 ➡️ MYSQL REDIS Advan…

深入理解计算机系统,源码到可执行文件翻译过程:预处理、编译,汇编和链接

1.前言 从一个高级语言到可执行程序&#xff0c;要经过预处理、编译&#xff0c;汇编和链接四个过程。大家可以思考下&#xff0c;为什么要有这样的过程&#xff1f; 我们学习计算机之处&#xff0c;就应该了解到&#xff0c;计算机能够识别的只有二进制语言&#xff08;这是…

linux系统清理全部python环境并重装

提问 centos系统清理全部python环境并重装&#xff0c;并且使用宝塔。 解答 要在CentOS系统中彻底清理Python3环境&#xff0c;可以遵循以下步骤&#xff1a; 卸载Python3 使用rpm命令卸载所有与Python3相关的包。这个命令会查询所有已安装的与python3相关的rpm包&#xf…

蓝桥杯——递归

1、用递归实现阶乘 5*4*3*2*1120 package day3;public class Demo6 {public static void main(String[] args) {int result f(5);System.out.println(result);}private static int f(int i) {if(i1) {return 1;}return i * f(i-1);}}结果&#xff1a;120 2、爬楼梯 有一个楼…

DAMODEL丹摩|部署FLUX.1+ComfyUI实战教程

本文仅做测评体验&#xff0c;非广告。 文章目录 1. FLUX.1简介2. 实战2. 1 创建资源2. 1 ComfyUI的部署操作2. 3 部署FLUX.1 3. 测试5. 释放资源4. 结语 1. FLUX.1简介 FLUX.1是由黑森林实验室&#xff08;Black Forest Labs&#xff09;开发的开源AI图像生成模型。它拥有12…

黑马程序员Java项目实战《苍穹外卖》Day02

苍穹外卖-day02 课程内容 新增员工员工分页查询启用禁用员工账号编辑员工导入分类模块功能代码 **功能实现&#xff1a;**员工管理、菜品分类管理。 员工管理效果&#xff1a; 菜品分类管理效果&#xff1a; 1. 新增员工 1.1 需求分析和设计 1.1.1 产品原型 一般在做需求…

《解锁计算机专业宝藏:核心编程语言与学习资料全解析》

在当今数字化浪潮汹涌澎湃、技术迭代日新月异的时代&#xff0c;计算机专业宛如一座蕴藏无尽宝藏与无限机遇的神秘殿堂&#x1f3f0;。对于莘莘学子而言&#xff0c;精准掌握核心编程语言&#xff0c;并手握优质学习资料&#xff0c;恰似寻得开启这扇殿堂大门的秘钥&#xff0c…

【Ubuntu 24.04】How to Install and Use NVM

参考 下载 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash激活 Activate NVM: Once the installation script completes, you need to either close and reopen the terminal or run the following command to use nvm immediately. exp…

【优选算法】位运算

目录 常见位运算总结1、基础位运算2、给一个数n&#xff0c;确定它的二进制位的第x位上是0还是13、将一个数n的二进制位的第x位改成14、将一个数n的二进制位的第x位改成05、位图的思想6、提取一个数n的二进制位中最右侧的17、将一个数n的二进制位中最右侧的1变为08、位运算的优…

systemverilog约束中:=和:/的区别

“x dist { [100:102] : 1, 200 : 2, 300 : 5}” 意味着其值等于100或101或102或200或300其中之一&#xff0c; 其权重比例为1:1:1:2:5 “x dist { [100:102] :/ 1, 200 : 2, 300 : 5}” 意味着等于100&#xff0c;101&#xff0c;102或200&#xff0c;或300其…

06_数据类型

数据类型 数据类型分类 JavaScript 语言的每一个值,都属于某一种数据类型。JavaScript 的数据类型,共有六种。(ES6 又新增了第七种 Symbol 类型的值和第八种 BigInt类型,当前课程暂不涉及) 据类型分类 原始类型(基础类型) var age = 20, var name = 尚学堂"; var le…

芯盾时代的身份安全产品体系

芯盾时代具备全栈零信任身份安全产品和服务能力&#xff1a; 芯盾时代IAM能够适配大企业用户复杂的应用访问需求&#xff0c;提供云端、互联网端、企业内网全场景的身份访问安全接入能力&#xff1b; 芯盾时代IAM能够理解大企业用户的身份差异&#xff0c;为内部用户、合作方和…

【Db First】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列 &#x1f…

shell综合

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&#…

Ubutuns服务器搭建与维护

1.靶机搭建 首先&#xff0c;安装 Apache2 作为 Web 服务器&#xff1a; sudo apt install apache2 安装完成后&#xff0c;可以启动 Apache 服务并确保它开机自启&#xff1a; sudo systemctl start apache2 sudo systemctl enable apache2然后&#xff0c;你可以通过访问…

003 LVGL相关文件分析

LVGL移植相关文件&#xff1a; 显示设备接口文件 lv_port_disp_templ.c/输入设备接口文件 lv_port_indev_templ.c/h 裁剪、配置文件 lv_conf.h lv_conf.h文件内容介绍&#xff1a; 对应中文翻译版本&#xff1a; #if 1 /* 设置为1&#xff0c;以启…

阿里巴巴即将超越OpenAI的o1?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Web自动化测试教程详解(附文档一份)

一、什么是web自动化测试 自动化&#xff08;Automation&#xff09;是指机器设备、系统或过程&#xff08;生产、管理过程&#xff09;在没有人或较少人的直接参与下&#xff0c;按照人的要求&#xff0c;经过自动检测、信息处理、分析判断、操纵控制&#xff0c;实现预期的目…

外包干了两年,快要废了。。。

先说一下自己的情况&#xff0c;普通本科&#xff0c;曾在外包干了2年多的功能测试&#xff0c;再加上大环境不好&#xff0c;那时我整个人心惊胆战的&#xff0c;怕自己卷铺盖走人了&#xff0c;所以当时我感觉自己不能够在这样蹉跎下去了&#xff0c;长时间呆在一个舒适的环境…