【问题标题】:NFC tag is not discovered for ACTION_NDEF_DISCOVERED action even if it contains Ndef data未发现 ACTION_NDEF_DISCOVERED 操作的 NFC 标签,即使它包含 Ndef 数据
【发布时间】:2015-08-18 23:36:19
【问题描述】:

我正在尝试使用三星 S5 读取 2 个不同的 NFC 标签。两个标签都包含一个 NDEF 消息,第一个标签包含一个 MIME 类型记录作为它的第一个记录,第二个标签包含一个替代载体记录 (TNF = TNF_WELL_KNOWN, Type = RTD_ALTERNATIVE_CARRIER) 作为它的第一个记录。

当我使用ACTION_TECH_DISCOVERED 意图通过前台调度读取标签时。对于第一个标签,技术列表列出了 NfcAMifareClassicNdef。对于第二个标签,它列出了NfcANdef

当我尝试使用 ACTION_NDEF_DISCOVERED 意图使用数据类型 "*/*" 读取标签时,第一个标签被发现很好,但根本没有发现第二个标签。

【问题讨论】:

  • 这两个标签存储了哪些数据?
  • 只是简单的以 Ndef 格式编写的测试数据。
  • 好的,澄清一下我的问题:这些标签上的 NDEF 消息中的第一个 NDEF 记录的数据类型是什么?
  • 在第一个标签 TNFType = TNF_MIME_MEDIA 和第二个标签 TNFType = TNF_WELL_KNOWN,RTDType = RTD_ALTERNATIVE_CARRIER

标签: android nfc intentfilter mifare ndef


【解决方案1】:

这里的问题是NDEF_DISCOVERED 意图过滤器是如何工作的。使用NDEF_DISCOVERED,您可以查看某个数据类型(即 MIME 类型)或某个 URI。在所有情况下,匹配都将应用于已发现标签的 NDEF 消息中的 first 记录。

通过数据类型匹配,您可以检测到

  • 包含给定 MIME 媒体类型的 MIME 类型记录或
  • 文本 RTD 记录 (TNF_WELL_KNOWN + RTD_TEXT),映射到 MIME 类型“text/plain”。

通过URI匹配,可以检测到

  • URI RTD 记录 (TNF_WELL_KNOWN + RTD_URI),
  • 封装在智能海报 RTD 记录中的 URI RTD 记录,
  • 具有基于 URI 的类型 (TNF_ABSOLUTE_URI) 的记录,或
  • NFC 论坛外部类型记录 (TNF_EXTERNAL)。

这两种匹配类型是互斥的,因此您可以在一个意图过滤器中匹配数据类型或 URI。

对于您的第二个标签,NDEF 意图调度系统不支持第一个记录的类型 (TNF_WELL_KNOWN + RTD_ALTERNATIVE_CARRIER)。因此,您不能将NDEF_DISCOVERED 意图过滤器与该标记结合使用。

示例

匹配数据类型:

  • 在清单中:

    <intent-filter>
        <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="some/mimetype" />
    </intent-filter>
    
  • 在代码中:

    IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
    ndef.addDataType("some/mimetype");
    

匹配一个 URL:

  • 在清单中:

    <intent-filter>
        <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:scheme="http"
              android:host="somehost.example.com"
              android:pathPrefix="/somepath" />
    </intent-filter>
    
  • 在代码中:

    IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
    ndef.addDataScheme("http");
    ndef.addDataAuthority("somehost.example.com", null);
    ndef.addDataPath("/somepath", PatternMatcher.PATTERN_PREFIX);
    

匹配 NFC 论坛外部类型:

  • 在清单中:

    <intent-filter>
        <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:scheme="vnd.android.nfc"
              android:host="ext"
              android:pathPrefix="/com.example:sometype" />
    </intent-filter>
    
  • 在代码中:

    IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
    ndef.addDataScheme("vnd.android.nfc");
    ndef.addDataAuthority("ext", null);
    ndef.addDataPath("/com.example:sometype", PatternMatcher.PATTERN_PREFIX);
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多