Flutter NFC模拟插件nfc_emulator的使用

发布于 1周前 作者 eggper 来自 Flutter

Flutter NFC模拟插件nfc_emulator的使用

NFC Emulator

一个用于模拟NFC标签的Flutter插件。仅支持Android(Apple一如既往地不支持)。


安装

pubspec.yaml文件中添加以下依赖:

dependencies:
  nfc_emulator: <最新版本>

运行flutter pub get以安装依赖。


Android配置

AndroidManifest.xml文件中添加NFC权限:

<uses-permission android:name="android.permission.NFC" />
<uses-feature android:name="android.hardware.nfc" android:required="false" />
<uses-feature android:name="android.hardware.nfc.hce" android:required="false" />
<uses-permission android:name="android.permission.VIBRATE" />

android/app/src/main/res/xml目录下创建或添加aid_list.xml文件(如不存在)。示例如下:

<?xml version="1.0" encoding="utf-8"?>
<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android">
    <aid-group
        android:category="other"
        android:apdu-list='["A0000000031010", "A0000000041010"]' />
</host-apdu-service>

AndroidManifest.xml中添加NFC模拟器服务,并包含aid_list配置:

<service
    android:name="io.flutter.plugins.nfc_emulator.NfcEmulatorService"
    android:exported="true"
    android:permission="android.permission.BIND_NFC_SERVICE">

    <!-- 指定支持卡模拟 -->
    <intent-filter>
        <action android:name="android.nfc.cardemulation.action.HOST_APDU_SERVICE" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>

    <!-- 定义要模拟的AID列表 -->
    <meta-data
        android:name="android.nfc.cardemulation.host_apdu_service"
        android:resource="@xml/aid_list" />
</service>

使用示例

检查NFC状态

检查设备是否支持NFC功能:

// 检查NFC状态
int nfcStatus = await NfcEmulator.nfcStatus;

启动NFC模拟器

启动NFC模拟器时,需要指定AID(应用标识符)、卡UID和可选的AES密钥:

// 启动NFC模拟器
await NfcEmulator.startNfcEmulator(
    "666B65630001", // AID
    "cd22c716",      // 卡UID
    "79e64d05ed6475d3acf405d6a9cd506b" // AES密钥(可选)
);

停止NFC模拟器

停止NFC模拟器:

// 停止NFC模拟器
await NfcEmulator.stopNfcEmulator();

示例代码

以下是完整的示例代码,展示如何使用nfc_emulator插件:

import 'package:flutter/material.dart';
import 'dart:async';

import 'package:flutter/services.dart';
import 'package:nfc_emulator/nfc_emulator.dart';

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

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

class _MyAppState extends State<MyApp> {
  String _platformVersion = 'Unknown'; // 平台版本
  NfcStatus _nfcStatus = NfcStatus.unknown; // NFC状态
  bool _started = false; // 是否已启动模拟器

  [@override](/user/override)
  void initState() {
    super.initState();
    initPlatformState(); // 初始化平台状态
  }

  // 初始化平台状态
  Future<void> initPlatformState() async {
    String platformVersion;
    NfcStatus nfcStatus;
    try {
      platformVersion = await NfcEmulator.platformVersion; // 获取平台版本
      nfcStatus = await NfcEmulator.nfcStatus; // 获取NFC状态
    } on PlatformException {
      platformVersion = 'Failed to get platform version.';
    }

    if (!mounted) return;

    setState(() {
      _platformVersion = platformVersion;
      _nfcStatus = nfcStatus;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('NFC Emulator Example'),
        ),
        body: Container(
          alignment: Alignment.center,
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
              Text('Version: $_platformVersion'), // 显示平台版本
              SizedBox(height: 20.0),
              Text('Status: $_nfcStatus'), // 显示NFC状态
              SizedBox(height: 40.0),
              RaisedButton(
                child: Text(_started ? "Stop Emulator" : "Start Emulator"), // 动态按钮文本
                onPressed: startStopEmulator, // 点击事件
              ),
            ],
          ),
        ),
      ),
    );
  }

  // 启动或停止NFC模拟器
  void startStopEmulator() async {
    if (_started) {
      await NfcEmulator.stopNfcEmulator(); // 停止模拟器
    } else {
      await NfcEmulator.startNfcEmulator(
          "666B65630001", // AID
          "cd22c716",      // 卡UID
          "79e64d05ed6475d3acf405d6a9cd506b"); // AES密钥(可选)
    }
    setState(() {
      _started = !_started; // 切换状态
    });
  }
}

更多关于Flutter NFC模拟插件nfc_emulator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter NFC模拟插件nfc_emulator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


nfc_emulator 是一个用于 Flutter 的插件,允许你在支持 NFC 的设备上模拟 NFC 标签。通过这个插件,你可以将你的设备变成一个虚拟的 NFC 标签,其他设备可以读取或写入数据。

以下是如何在 Flutter 项目中使用 nfc_emulator 插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  nfc_emulator: ^0.0.1  # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

2. 配置 Android 和 iOS 项目

Android

AndroidManifest.xml 文件中添加 NFC 权限:

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

iOS

Info.plist 文件中添加 NFC 权限描述:

<key>NFCReaderUsageDescription</key>
<string>We need NFC access to emulate NFC tags.</string>

3. 使用 nfc_emulator 插件

在你的 Dart 代码中导入 nfc_emulator 插件并开始使用它。

import 'package:flutter/material.dart';
import 'package:nfc_emulator/nfc_emulator.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('NFC Emulator Example'),
        ),
        body: Center(
          child: NFCEmulatorDemo(),
        ),
      ),
    );
  }
}

class NFCEmulatorDemo extends StatefulWidget {
  @override
  _NFCEmulatorDemoState createState() => _NFCEmulatorDemoState();
}

class _NFCEmulatorDemoState extends State<NFCEmulatorDemo> {
  String _status = 'Not Emulating';

  Future<void> _startEmulation() async {
    try {
      await NfcEmulator.startEmulation(
        payload: "Hello, NFC!",  // 你要模拟的 NFC 数据
      );
      setState(() {
        _status = 'Emulating NFC Tag';
      });
    } catch (e) {
      setState(() {
        _status = 'Failed to start emulation: $e';
      });
    }
  }

  Future<void> _stopEmulation() async {
    try {
      await NfcEmulator.stopEmulation();
      setState(() {
        _status = 'Emulation Stopped';
      });
    } catch (e) {
      setState(() {
        _status = 'Failed to stop emulation: $e';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text('Status: $_status'),
        SizedBox(height: 20),
        ElevatedButton(
          onPressed: _startEmulation,
          child: Text('Start Emulation'),
        ),
        SizedBox(height: 20),
        ElevatedButton(
          onPressed: _stopEmulation,
          child: Text('Stop Emulation'),
        ),
      ],
    );
  }
}

4. 运行项目

确保你的设备支持 NFC 并且已经启用 NFC 功能。然后运行你的 Flutter 项目:

flutter run
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!