Flutter实现NFC跨移动设备文本共享技术问询
Flutter NFC 设备发现与文本互传实现方案
依赖包选择
使用flutter_nfc_kit包,它支持Android和iOS平台的NFC基础操作,包括设备发现、NDEF消息读写,足够满足你的需求。在pubspec.yaml中添加依赖:
dependencies: flutter_nfc_kit: ^3.3.0
平台权限配置
Android
在android/app/src/main/AndroidManifest.xml中添加NFC权限和相关配置:
<!-- NFC权限 --> <uses-permission android:name="android.permission.NFC" /> <!-- 声明设备支持NFC --> <uses-feature android:name="android.hardware.nfc" android:required="true" /> <!-- 在activity标签内添加前台NFC调度配置 --> <intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter> <intent-filter> <action android:name="android.nfc.action.TECH_DISCOVERED" /> </intent-filter> <meta-data android:name="android.nfc.action.TECH_DISCOVERED" android:resource="@xml/nfc_tech_filter" />
然后在android/app/src/main/res/xml目录下创建nfc_tech_filter.xml文件,内容如下:
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <tech-list> <tech>android.nfc.tech.Ndef</tech> <tech>android.nfc.tech.NdefFormatable</tech> </tech-list> </resources>
iOS
在ios/Runner/Info.plist中添加NFC权限描述和NDEF支持:
<key>NFCReaderUsageDescription</key> <string>需要使用NFC功能进行设备间文本传输</string> <key>com.apple.developer.nfc.readersession.iso7816.select-identifiers</key> <array> <string>A0000002471001</string> </array> <key>com.apple.developer.nfc.readersession.formats</key> <array> <string>NDEF</string> </array>
核心功能实现
以下是完整的示例代码,实现NFC设备发现、触碰时文本互传:
import 'package:flutter/material.dart'; import 'package:flutter_nfc_kit/flutter_nfc_kit.dart'; class NFCTransferPage extends StatefulWidget { const NFCTransferPage({super.key}); @override State<NFCTransferPage> createState() => _NFCTransferPageState(); } class _NFCTransferPageState extends State<NFCTransferPage> { String _status = "未启动NFC监听"; final TextEditingController _messageController = TextEditingController(text: "Hello NFC!"); // 初始化并启动NFC监听 Future<void> _startNFCListener() async { try { // 检查设备是否支持NFC final isAvailable = await FlutterNfcKit.nfcAvailability; if (isAvailable != NFCAvailability.available) { setState(() { _status = "设备不支持NFC或NFC未开启"; }); return; } setState(() { _status = "正在监听NFC设备..."; }); // 启动NFC会话,监听NDEF消息 final tag = await FlutterNfcKit.poll( timeout: const Duration(seconds: 30), pollOptions: const PollOptions( iosMultipleTagMessage: true, androidEnableReaderMode: true, ), ); // 读取标签中的NDEF消息 if (tag.ndefAvailable!) { final ndefMessage = await FlutterNfcKit.readNDEF(); if (ndefMessage != null && ndefMessage.records.isNotEmpty) { final receivedText = String.fromCharCodes(ndefMessage.records.first.payload); setState(() { _status = "收到消息: $receivedText"; }); } } // 发送当前输入的文本到对方设备 await FlutterNfcKit.writeNDEF( NDEFMessage([ NDEFRecord.createText(_messageController.text), ]), ); setState(() { _status = "消息已发送: ${_messageController.text}"; }); // 结束会话 await FlutterNfcKit.finish(); } catch (e) { setState(() { _status = "出错: ${e.toString()}"; }); await FlutterNfcKit.finish(); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text("NFC文本互传")), body: Padding( padding: const EdgeInsets.all(16.0), child: Column( children: [ TextField( controller: _messageController, decoration: const InputDecoration(labelText: "输入要发送的文本"), ), const SizedBox(height: 20), ElevatedButton( onPressed: _startNFCListener, child: const Text("启动NFC监听"), ), const SizedBox(height: 20), Text(_status, style: const TextStyle(fontSize: 16)), ], ), ), ); } }
关键说明与注意事项
- 设备要求:两台设备都必须支持NFC,且开启NFC功能(Android通常在设置中开启,iOS需在控制中心或设置中开启)。
- 触碰逻辑:启动监听后,将两台设备的NFC区域靠近(通常在手机背部),系统会自动检测并完成消息读写。
- NDEF格式:示例中使用NDEF文本格式,这是NFC设备间互传数据的标准格式,兼容性最好。
- Android前台调度:Android设备需要在前台开启NFC监听才能稳定检测到其他设备,示例中已通过
androidEnableReaderMode配置。 - iOS限制:iOS的NFC会话只能在前台启动,且需要用户手动触发(比如点击按钮),无法后台自动监听。
内容的提问来源于stack exchange,提问作者Guru Subramani
相关产品推荐
相关产品推荐

