【问题标题】:NFC Tag is null when more than >1 NdefRecord当大于 >1 NdefRecord 时,NFC 标签为空
【发布时间】:2014-05-19 15:25:35
【问题描述】:

我是 Android 上 NFC 的新手,但我设法让应用程序读取和写入 NFC 标签。

最初,我在标签上的 NdefMessage 中有一个 NdefRecord,基本上是一些数据。每当我扫描它时,我都能成功地从标签中检索数据。

然后我想添加一个应用程序记录,这样如果用户扫描我的标签并且没有我的应用程序,他们就会被重定向到 PlayStore。

当我将应用程序记录引入标签时,每次我扫描标签时,我的活动都由onCreate()onNewIntent() 开始/恢复,我尝试获取Tag,但它始终为空。这是为什么呢?

这是我写给标签的内容;

Tag detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);      
NdefRecord appRecord = NdefRecord.createApplicationRecord("com.myorg.myapp");
NdefRecord record = new NdefRecord(NdefRecord.TNF_MIME_MEDIA,
        new String("application/com.myorg.myapp")
        .getBytes(Charset.forName("US-ASCII")),
        null, "StringData".getBytes());
NdefMessage message = new NdefMessage(new NdefRecord[] { appRecord, record });
if (writeTag(message, detectedTag)) {
Toast.makeText(this, "Success: Wrote placeid to nfc tag", Toast.LENGTH_LONG).show();
} 

这是我阅读标签的地方(onCreate()onNewIntent());

Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
if(tag!=null) {
    readTag(tag);
}

我在 AndroidManifest.xml 中的 IntentFilters

 <intent-filter>
                <action android:name="android.nfc.action.NDEF_DISCOVERED" />
                <data android:mimeType="application/com.myorg.myapp" />
                <category android:name="android.intent.category.DEFAULT" />
 </intent-filter>

【问题讨论】:

  • 您在 AndroidManifest.xml 中使用了哪些意图过滤器?
  • @MichaelRoland 已更新 :)

标签: android nfc ndef android-applicationrecord


【解决方案1】:

NDEF_DISCOVERED Intent 只能过滤标签的 NDEF 消息中第一条记录的类型。您的 NDEF 消息如下所示:

+-----------------------------------------------+
| EXT:android:com:pkg | com.myorg.myapp         |
+-----------------------------------------------+
| MIME:application/com.myorg.myapp | StringData |
+-----------------------------------------------+

因此,您需要修改您的意图过滤器以对外部类型android:com:pkg 敏感。或者,您将 Android 应用程序记录 (AAR) 移动到 NDEF 消息的末尾(这是首选方式):

NdefMessage message = new NdefMessage(new NdefRecord[] { record, appRecord });

这会导致此消息:

+-----------------------------------------------+
| MIME:application/com.myorg.myapp | StringData |
+-----------------------------------------------+
| EXT:android:com:pkg | com.myorg.myapp         |
+-----------------------------------------------+

这使得application/com.myorg.myapp 记录(您在清单中过滤)成为用于意图过滤器匹配的记录。

最后,我强烈建议您使用 NFC Forum 外部类型,而不是使用自定义 MIME 类型。这有两个好处:

  1. 外部类型名称中的类型名称可以比以“application/”开头的 MIME 类型更紧凑(更少字节)。
  2. 您(由于基于域的命名空间概念)受到保护,不会与注册的 MIME 类型发生命名冲突。

【讨论】:

  • 感谢您的回答。我明天早上试试这个。我之前曾尝试将 AAR 切换到 NDEF 消息的末尾 - 我相信当我在没有安装我的应用程序的手机上扫描标签时,它只会显示第一个 NDEF 记录,而不是重定向到 Play 商店.不过,我明天会回复你的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多