首页 > 解决方案 > 如何在 Android 中创建标签对象

问题描述

我正在尝试将标记对象用于我的 Flutter 插件。使用 MethodChannel 我可以调用 Java 函数,但我的标记对象仍然为空。我将如何正确创建此 Intent?

else if (call.method.equals("readTag")) {
      Intent intent = new Intent("android.intent.action.MAIN");
      Tag nfcTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

我的猜测是 Intent 不能以这种方式创建,这就是为什么它为标签返回一个空对象。

标签: androidflutterandroid-intentnfcflutter-plugin

解决方案


由于您已经创建了一个new并且为空的Intent,因此没有什么可以读取的。所以正如预期的那样。

AnIntent实际上只是一个通用存储类,通常用于在一个 Activity 和另一个 Activity 之间以标准格式传递数据。

它们用于keys在活动之间传递特定数据。keys系统 NFC 活动用于将 NFC 相关数据传递给您的活动的其中一项是NfcAdapter.EXTRA_TAG密钥。

Intent 与实际读取 NFC Tag 无关,它们只是用作一种通信方法,要求 System NFC Activity 执行操作以及它如何返回数据。

所以你可以在任何你想要的地方创建它们,包含许多不同的内容,并将它们传递给任何 Activity 以提供数据或接收它们以发送数据。

您似乎无法理解 NFC 在 Android 中的工作原理。
基本概念是。

旧 API
您创建一个Intent基本上带有“消息”的系统 NFC 应用程序说“我想在进入范围时发送有关特定类型的 NFC 数据的数据”,您Intent使用该消息将该消息发送到系统 NFC 活动enableForegroundDispatch,当系统 NFC 应用程序看到正确类型的标签进入范围时,它会创建一个Intent来存储有关 NFC 标签的数据以发送回请求它的活动。
这是使用通用方法进行进程间通信。

较新的 API
enableReaderMode您使用 NFC 特定方法再次发送有关您感兴趣的标签的数据时执行类似操作,并在看到请求类型的标签进入范围时以更具体的格式发回。
较新 API 的示例https://stackoverflow.com/a/64921434/2373819

清单过滤器 清单过滤器独立于旧 API 和新 API,它们用于存储系统 NFC 应用程序可以用来决定它是否应该在看到特定类型的 NFC 卡时启动您的应用程序的信息。它们可以与旧 API 和新 API 一起使用,但它们Ìntent使用与旧 API 相同的字段将消息传递给您的应用程序,可以onCreate使用getIntent.

因此,创建一个newIntent并期望神奇地获得一些 NFC 数据是错误的。


推荐阅读