Flutter NFC读写插件ndef_record的使用

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

Flutter NFC读写插件ndef_record的使用

ndef_record 是一个用于实现NFC数据交换格式(NDEF)规范的Dart库。它提供了低级别的API,因此你需要自己实现字节数据的编码和解码。

示例

以下是几个使用 ndef_record 插件创建不同类型的NDEF记录的示例:

示例1:Well-Known Record (RTD:T)

NdefRecord(
  typeNameFormat: TypeNameFormat.wellKnown, // 类型名称格式为已知类型
  type: ascii.encode('T'), // 类型名称为 'T'
  identifier: Uint8List(0), // 标识符为空
  payload: Uint8List.fromList([ // 负载数据
    0x02, // 二进制数据
    ...ascii.encode('en'), // ASCII 编码的字符串 'en'
    ...ascii.encode('Hello'), // ASCII 编码的字符串 'Hello'
  ]),
);

示例2:Well-Known Record (RTD:U)

NdefRecord(
  typeNameFormat: TypeNameFormat.wellKnown, // 类型名称格式为已知类型
  type: ascii.encode('U'), // 类型名称为 'U'
  identifier: Uint8List(0), // 标识符为空
  payload: Uint8List.fromList([ // 负载数据
    0x03, // 二进制数据
    ...utf8.encode('example.com'), // UTF-8 编码的字符串 'example.com'
  ]),
);

示例3:Mime Record

NdefRecord(
  typeNameFormat: TypeNameFormat.media, // 类型名称格式为媒体类型
  type: ascii.encode('text/plain'), // 类型名称为 'text/plain'
  identifier: Uint8List(0), // 标识符为空
  payload: ascii.encode('Hello'), // ASCII 编码的字符串 'Hello'
);

示例4:External Record (Android Application)

NdefRecord(
  typeNameFormat: TypeNameFormat.external, // 类型名称格式为外部类型
  type: ascii.encode('android.com:pkg'), // 类型名称为 'android.com:pkg'
  identifier: Uint8List(0), // 标识符为空
  payload: utf8.encode('example'), // UTF-8 编码的字符串 'example'
);

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

1 回复

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


在Flutter中,处理NFC读写功能通常需要使用到一些第三方插件,尤其是当你需要处理NDEF记录时。ndef_record 是一个常用的NFC插件,可以帮助你在Flutter应用中读写NFC标签。

以下是一个基本的示例,展示如何使用 ndef_record 插件来读写NFC标签。请注意,你需要先在 pubspec.yaml 文件中添加该插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  ndef_record: ^x.y.z  # 请替换为实际的版本号

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

读取NFC标签

首先,确保你已经请求并获得了NFC读取权限。然后,你可以使用以下代码来读取NFC标签:

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

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

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

class NFCReader extends StatefulWidget {
  @override
  _NFCReaderState createState() => _NFCReaderState();
}

class _NFCReaderState extends State<NFCReader> {
  NfcManager? nfcManager;

  @override
  void initState() {
    super.initState();
    NfcManager.instance.startSession().then((session) {
      nfcManager = session;
      nfcManager!.onDiscovered!.listen((NfcTag tag) async {
        List<NdefRecord> records = await tag.ndef!.read();
        records.forEach((record) {
          print('NDEF Record: ${record.payloadAsString}');
        });
      });
    });
  }

  @override
  void dispose() {
    nfcManager?.endSession();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Text('Hold your NFC tag near the device'),
    );
  }
}

写入NFC标签

写入NFC标签的过程稍微复杂一些,因为你需要构建NDEF消息,然后将其写入标签。以下是一个写入示例:

import 'package:ndef_record/ndef_record.dart';

// 假设你已经有了一个NfcTag实例,名为`tag`
Future<void> writeNfcTag(NfcTag tag) async {
  List<NdefRecord> records = [
    NdefRecord.createTextRecord('en', 'Hello, NFC!'),
  ];

  // 将NDEF记录写入NFC标签
  await tag.ndef!.write(records);
}

在实际使用中,你需要将 writeNfcTag 函数与NFC标签的发现逻辑结合起来。例如,在 nfcManager!.onDiscovered!.listen 的回调中调用它:

nfcManager!.onDiscovered!.listen((NfcTag tag) async {
  // 读取标签内容(可选)
  List<NdefRecord> records = await tag.ndef!.read();
  print('Existing Records: $records');

  // 写入新内容
  await writeNfcTag(tag);

  // 重新读取以验证写入
  List<NdefRecord> newRecords = await tag.ndef!.read();
  print('New Records: $newRecords');
});

注意事项

  1. 权限处理:在实际应用中,你需要处理用户权限请求,确保应用有权限访问NFC硬件。
  2. 错误处理:添加适当的错误处理逻辑,以处理NFC硬件不可用、读取/写入失败等情况。
  3. 平台限制:NFC功能通常受限于硬件支持,确保在支持NFC的设备上测试你的应用。

这个示例展示了如何使用 ndef_record 插件来读取和写入NFC标签的NDEF记录。根据你的具体需求,你可能需要调整这些代码。

回到顶部