我正在尝试用三星S5读取2种不同的NFC标签。两个标签都包含一个NDEF消息,第一个标签包含一个MIME类型记录作为它的第一个记录,第二个标签包含一个替代载体记录(TNF = TNF_WELL_KNOWN, type = RTD_ALTERNATIVE_CARRIER)作为它的第一个记录。
当我使用ACTION_TECH_DISCOVERED
意图通过前台调度读取标签时。对于第一个标签,技术列表列出了NfcA
, MifareClassic
和Ndef
。对于第二个标签,它列出了NfcA
和Ndef
。
当我尝试使用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);