Flutter中如何使用nfc_manager 4.0.0之后版本获取nfca属性

在Flutter项目中使用nfc_manager 4.0.0以上版本时,如何正确获取NFCA标签的属性数据?我按照官方文档尝试了NfcA类型的tag读取,但调用tag.data或tag.identifier时返回的数据格式与预期不符。能否提供一个完整的代码示例,展示从NFC设备检测到成功获取NFCA标签ID和ATQA/SAK等属性的完整流程?需要特别注意哪些API调用顺序或权限配置?

2 回复

在Flutter中使用nfc_manager 4.0.0+获取NFCA属性:

  1. 添加依赖:nfc_manager: ^4.0.0
  2. 检查NFC支持:NfcManager.instance.isAvailable()
  3. 开始会话:
NfcManager.instance.startSession(
  onDiscovered: (NfcTag tag) {
    final nfca = tag.data['nfca'];
    print('ATQA: ${nfca['atqa']}');
    print('SAK: ${nfca['sak']}');
    print('UID: ${nfca['identifier']}');
  }
);

注意:需要添加NFC权限。

更多关于Flutter中如何使用nfc_manager 4.0.0之后版本获取nfca属性的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中使用nfc_manager 4.0.0+版本获取NFCA属性,可以通过以下步骤实现:

1. 添加依赖

pubspec.yaml 中添加:

dependencies:
  nfc_manager: ^4.0.0

2. 请求NFC权限

AndroidManifest.xml 中添加:

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

3. 核心代码实现

import 'package:nfc_manager/nfc_manager.dart';

class NfcHandler {
  Future<void> startNfcReading() async {
    bool isAvailable = await NfcManager.instance.isAvailable();
    if (!isAvailable) {
      print('NFC not available');
      return;
    }

    NfcManager.instance.startSession(
      onDiscovered: (NfcTag tag) async {
        // 获取NFCA属性
        NfcA? nfcA = NfcA.from(tag);
        if (nfcA == null) {
          print('Not an NFC-A tag');
          NfcManager.instance.stopSession();
          return;
        }

        try {
          // 获取ATQA和SAK
          Uint8List atqa = nfcA.atqa;
          int sak = nfcA.sak;
          int maxTransceiveLength = nfcA.maxTransceiveLength;
          int timeout = nfcA.timeout;

          print('ATQA: $atqa');
          print('SAK: $sak');
          print('Max Transceive Length: $maxTransceiveLength');
          print('Timeout: $timeout');

          // 可选:发送APDU指令
          // Uint8List response = await nfcA.transceive(data);

        } catch (e) {
          print('Error: $e');
        } finally {
          NfcManager.instance.stopSession();
        }
      },
    );
  }
}

4. 使用示例

在StatefulWidget中调用:

@override
Widget build(BuildContext context) {
  return ElevatedButton(
    onPressed: () => NfcHandler().startNfcReading(),
    child: Text('Start NFC Reading'),
  );
}

关键属性说明:

  • atqa: Answer To Request A (2字节)
  • sak: Select Acknowledge (1字节)
  • maxTransceiveLength: 最大传输长度
  • timeout: 超时时间

注意事项:

  1. 确保设备支持NFC
  2. 需要在AndroidManifest.xml中声明NFC权限
  3. 及时调用stopSession()释放资源
  4. 处理可能出现的异常

这样就能成功获取NFC-A标签的基本属性信息了。

回到顶部