当前位置: 首页 > article >正文

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


http://www.kler.cn/a/418940.html

相关文章:

  • 【赵渝强老师】PostgreSQL的段、区和块
  • Maya 中创建游戏角色的头发,并将其导出到 Unreal Engine 5
  • 探索温度计的数字化设计:一个可视化温度数据的Web图表案例
  • k8s 1.28 聚合层部署信息记录
  • 看华为,引入IPD的正确路径
  • 力扣1382:将二叉搜索树便平衡
  • MVC core 传值session
  • Android 混淆问题
  • Rust vs Java:后端开发应该选哪个?
  • npm 最新国内淘宝镜像地址源 (旧版已不能用)
  • VS Code前端常用插件
  • 使用ECharts创建带百分比标注的环形图
  • ZOOKEEPER [Zookeeper——Docker下安装部署]
  • 解决“ VMware Tools for Windows Vista and later“报错问题
  • 泷羽sec-云技术
  • 机器学习6_支持向量机_算法流程
  • 易速鲜花聊天客服机器人的开发(下)
  • 服务器数据恢复—raid6阵列硬盘被误重组为raid5阵列的数据恢复案例
  • qt QConicalGradient详解
  • 解决虚拟机中 GitHub 无法通过 HTTPS 访问的问题
  • springboot359智慧草莓基地管理系统(论文+源码)_kaic
  • 深度学习现有网络的使用和修改以VGG16为例
  • MFC中如何在工具条动态增加菜单
  • TextBlob:简单高效的自然语言处理工具
  • Excel如何限制单元格内可选择的下拉框内容?
  • 【LeetCode】每日一题 2024_12_1 N 皇后(回溯,DFS)