我试着用三星s5读两个不同的nfc标签。两个标记都包含一个ndef消息,第一个标记包含一个mime类型的记录作为其第一个记录,第二个标记包含一个备用载波记录(tnf=tnf_well_known,type=rtd_alternative_carrier)作为其第一个记录。
当我使用ACTION_TECH_DISCOVERED
intent通过前台调度读取标记时。对于第一个标记,技术列表列出NfcA
、MifareClassic
和Ndef
。对于第二个标记,它列出NfcA
和Ndef
。
当我尝试使用ACTION_NDEF_DISCOVERED
intent使用数据类型“*/*”读取标记时,第一个标记被发现是正常的,但第二个标记根本没有被发现。
最佳答案
这里的问题是NDEF_DISCOVERED
意图过滤器如何工作。使用NDEF_DISCOVERED
可以监视特定的数据类型(即mime类型)或特定的uri。在所有情况下,匹配都将应用于发现的标记的ndef消息中的第一条记录。
通过数据类型匹配,您可以检测
包含给定mime媒体类型或
文本RTD记录(TNF_well_known+RTD_text),映射到mime类型“text/plain”。
通过uri匹配,您可以检测
一个uri-rtd记录(已知的TNF+rtd-uri)
封装在智能海报RTD记录中的uri RTD记录,
基于uri类型的记录(绝对值),或
NFC论坛外部类型记录(TNF_外部)。
这两种匹配类型是互斥的,因此您可以在一个意图过滤器中匹配数据类型或uri。
对于第二个标签,ndef意图调度系统不支持第一个记录的类型(tnf_well_known+rtd_alternative_carrier)。因此,不能将NDEF_DISCOVERED
intent过滤器与该标记结合使用。
实例
匹配数据类型:
在清单中:
<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);