Flutter指纹识别插件futronic的使用

Flutter指纹识别插件futronic的使用

该插件用于与Futronic设备进行通信。目前仅在FS80设备上进行了测试。该插件提供了主要功能,例如采集生物特征模板并基于另一个模板验证生物特征。

详细说明:

为了使插件正常工作,需要将FTRAPI.dllftrScanAPI.dll 这两个DLL文件提取到System32目录下。

import 'package:flutter/material.dart';
import 'package:futronic/enum/ftr_signal_status.dart';
import 'package:futronic/futronic_enroll_result.dart';
import 'package:futronic/futronic_utils.dart';
import 'package:futronic/futronico.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized(); // 确保Flutter框架已初始化
  runApp(const FutronicoExample());
}

class FutronicoExample extends StatelessWidget {
  const FutronicoExample({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const FutronicExamplePage(title: 'Futronico 示例'),
    );
  }
}

class FutronicExamplePage extends StatefulWidget {
  const FutronicExamplePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  State<FutronicExamplePage> createState() => _FutronicExamplePageState();
}

class _FutronicExamplePageState extends State<FutronicExamplePage> {
  [@override](/user/override)
  void dispose() {
    futronico.terminate(); // 释放资源
    super.dispose();
  }

  Futronico futronico = Futronico(); // 初始化Futronico实例

  [@override](/user/override)
  void initState() {
    setListener(); // 设置监听器
    super.initState();
  }

  void setListener() {
    Futronico.futronicStatusController.stream.listen((event) { // 监听状态变化
      if (event.currentStatus == FTR_SIGNAL_STATUS.touch_sensor) {
        setState(() {
          textoResultado = "放置手指"; // 显示提示信息
        });
      }
      if (event.currentStatus == FTR_SIGNAL_STATUS.take_off) {
        setState(() {
          textoResultado = "移开手指"; // 显示提示信息
        });
      }
    });
  }

  bool hasReceivedSomeBiometry = false; // 是否已经接收过生物特征
  String textoResultado = "等待指纹"; // 初始文本
  List<int> ultimaDigital = []; // 存储最后采集的指纹数据

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title), // 设置标题
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(textoResultado), // 显示当前状态
            TextButton(
                onPressed: () {
                  futronico.cancelOperation(); // 取消操作
                },
                child: Text("取消读取")),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () async { // 按钮点击事件
          try {
            if (!hasReceivedSomeBiometry) {
              FutronicEnrollResult enrollResult = await futronico.enrollTemplate(); // 采集指纹模板
              ultimaDigital = enrollResult.enrollTemplate;
              setState(() {
                textoResultado = "收到指纹,质量为 ${enrollResult.quality}/10"; // 更新文本
              });
              hasReceivedSomeBiometry = true; // 标记已接收指纹
            } else {
              bool isTheSame = await futronico.verify(ultimaDigital, far: 0.01); // 验证指纹
              setState(() {
                textoResultado = isTheSame ? "指纹相同" : "指纹不匹配"; // 更新文本
              });
            }
          } on FutronicError catch (e) {
            setState(() {
              textoResultado = e.message; // 错误处理
            });
          }
        },
        tooltip: 'Increment',
        child: const Icon(Icons.add), // 设置图标
      ),
    );
  }
}

示例代码

以下是完整的示例代码,展示了如何使用Futronico插件来采集和验证指纹:

import 'package:flutter/material.dart';
import 'package:futronic/enum/ftr_signal_status.dart';
import 'package:futronic/futronic_enroll_result.dart';
import 'package:futronic/futronic_utils.dart';
import 'package:futronic/futronico.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(const FutronicoExample());
}

class FutronicoExample extends StatelessWidget {
  const FutronicoExample({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const FutronicExamplePage(title: 'Futronico 示例'),
    );
  }
}

class FutronicExamplePage extends StatefulWidget {
  const FutronicExamplePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  State<FutronicExamplePage> createState() => _FutronicExamplePageState();
}

class _FutronicExamplePageState extends State<FutronicExamplePage> {
  [@override](/user/override)
  void dispose() {
    futronico.terminate();
    super.dispose();
  }

  Futronico futronico = Futronico();

  [@override](/user/override)
  void initState() {
    setListener();
    super.initState();
  }

  void setListener() {
    Futronico.futronicStatusController.stream.listen((event) {
      if (event.currentStatus == FTR_SIGNAL_STATUS.touch_sensor) {
        setState(() {
          textoResultado = "放置手指";
        });
      }
      if (event.currentStatus == FTR_SIGNAL_STATUS.take_off) {
        setState(() {
          textoResultado = "移开手指";
        });
      }
    });
  }

  bool hasReceivedSomeBiometry = false;
  String textoResultado = "等待指纹";
  List<int> ultimaDigital = [];

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(textoResultado),
            TextButton(
                onPressed: () {
                  futronico.cancelOperation();
                },
                child: Text("取消读取")),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          try {
            if (!hasReceivedSomeBiometry) {
              FutronicEnrollResult enrollResult = await futronico.enrollTemplate();
              ultimaDigital = enrollResult.enrollTemplate;
              setState(() {
                textoResultado = "收到指纹,质量为 ${enrollResult.quality}/10";
              });
              hasReceivedSomeBiometry = true;
            } else {
              bool isTheSame = await futronico.verify(ultimaDigital, far: 0.01);
              setState(() {
                textoResultado = isTheSame ? "指纹相同" : "指纹不匹配";
              });
            }
          } on FutronicError catch (e) {
            setState(() {
              textoResultado = e.message;
            });
          }
        },
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

更多关于Flutter指纹识别插件futronic的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter指纹识别插件futronic的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


futronic 是一个用于在 Flutter 应用中实现指纹识别的插件。它允许开发者通过集成指纹扫描硬件来增强应用的安全性。以下是如何在 Flutter 项目中使用 futronic 插件的步骤。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 futronic 插件的依赖。

dependencies:
  flutter:
    sdk: flutter
  futronic: ^1.0.0  # 请使用最新版本

然后,运行 flutter pub get 来获取依赖。

2. 配置 Android 项目

在 Android 项目中,确保你已经启用了指纹识别功能。你需要在 AndroidManifest.xml 文件中添加以下权限:

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

3. 初始化插件

在你的 Dart 代码中,首先需要导入 futronic 插件,然后初始化它。

import 'package:futronic/futronic.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: FingerprintScreen(),
    );
  }
}

class FingerprintScreen extends StatefulWidget {
  [@override](/user/override)
  _FingerprintScreenState createState() => _FingerprintScreenState();
}

class _FingerprintScreenState extends State<FingerprintScreen> {
  final Futronic _futronic = Futronic();

  [@override](/user/override)
  void initState() {
    super.initState();
    _initializeFutronic();
  }

  void _initializeFutronic() async {
    bool initialized = await _futronic.initialize();
    if (initialized) {
      print("Futronic initialized successfully");
    } else {
      print("Failed to initialize Futronic");
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Fingerprint Authentication'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: _authenticate,
          child: Text('Authenticate with Fingerprint'),
        ),
      ),
    );
  }

  void _authenticate() async {
    bool authenticated = await _futronic.authenticate();
    if (authenticated) {
      print("Fingerprint authentication successful");
      // 认证成功后的操作
    } else {
      print("Fingerprint authentication failed");
      // 认证失败后的操作
    }
  }
}

4. 处理认证结果

_authenticate 方法中,你可以根据 authenticate 方法的返回值来处理认证成功或失败的情况。

5. 释放资源

在使用完 futronic 插件后,记得释放资源以避免内存泄漏。

[@override](/user/override)
void dispose() {
  _futronic.dispose();
  super.dispose();
}
回到顶部