ACTION_NDEF_DISCOVERED动作不会发现NFC标签,即使它包含Ndef数据



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

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

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

这里的问题是NDEF_DISCOVERED意图过滤器如何工作。使用NDEF_DISCOVERED,您可以监视特定的数据类型(例如MIME类型)或特定的URI。在所有情况下,匹配将应用于发现标签的NDEF消息中的第一条记录。

使用数据类型匹配,您可以检测

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

使用URI匹配,您可以检测

    一个URI RTD记录(TNF_WELL_KNOWN + RTD_URI),
  • URI RTD记录封装在Smart Poster RTD记录内,
  • 一个基于URI类型(TNF_ABSOLUTE_URI)的记录,或者
  • 一个NFC论坛外部类型记录(TNF_EXTERNAL)。

两个匹配类型是互斥的,所以你可以在一个intent过滤器中匹配一个数据类型或一个URI。

在你的第二个标签的情况下,第一个记录的类型(TNF_WELL_KNOWN + RTD_ALTERNATIVE_CARRIER)不被NDEF意图调度系统支持。因此,您不能将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);
    

最新更新