Flutter NFC模拟插件nfc_emulator的使用
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
更多关于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