Android NFC中TAG_DISCOVERED、NDEF_DISCOVERED与TECH_DISCOVERED的区别及问题咨询
Android NFC中TAG_DISCOVERED、NDEF_DISCOVERED、TECH_DISCOVERED的区别(Java)
Android NFC系统会按 NDEF_DISCOVERED > TECH_DISCOVERED > TAG_DISCOVERED 的优先级顺序匹配Intent,只有前序Intent匹配失败时,才会触发后续的Intent。下面逐个拆解三者的核心差异:
1. NDEF_DISCOVERED
- 优先级最高,专门针对存储了NDEF格式数据的NFC标签。
- 触发条件:标签必须包含有效的NDEF消息,且你的应用在Manifest中声明的
<intent-filter>能匹配该NDEF消息的记录类型(比如特定MIME类型、URI或NFC Forum外部类型)。 - 示例Manifest配置(匹配文本类NDEF标签):
<intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="text/plain"/> </intent-filter>
- 你的电子货币卡检测不到它,大概率是因为这张卡没有存储NDEF格式的数据,或者它的NDEF数据类型不在你声明的匹配范围内。
2. TECH_DISCOVERED
- 优先级居中,用于识别支持特定NFC技术标准的标签,和标签内是否有NDEF数据无关。
- 触发条件:标签支持你在Manifest中通过
<tech-list>声明的NFC技术(比如ISO 14443 Type A/B、MIFARE Classic、NfcF等),且NDEF_DISCOVERED未匹配成功。 - 示例Manifest配置(匹配MIFARE Classic标签):
<intent-filter> <action android:name="android.nfc.action.TECH_DISCOVERED"/> </intent-filter> <meta-data android:name="android.nfc.action.TECH_DISCOVERED" android:resource="@xml/nfc_tech_filter"/>
对应的res/xml/nfc_tech_filter.xml:
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <tech-list> <tech>android.nfc.tech.MifareClassic</tech> </tech-list> </resources>
- 若要读取电子货币卡的具体数据(如余额),通常需要用这个Intent——这类卡一般基于特定NFC技术,但很少携带NDEF数据。
3. TAG_DISCOVERED
- 优先级最低,是兜底Intent,当前两个Intent都匹配失败时触发。
- 触发条件:只要是NFC标签被检测到,就会触发,无需满足任何额外数据或技术匹配要求。
- 它只能获取标签的基础信息(如ID),无法直接访问标签的技术特性或深层数据,适合仅需识别标签存在、获取ID的场景。
- 你的电子货币卡能被它检测到,就是因为它不满足前两个Intent的触发条件,系统自动触发了这个兜底规则。
针对你的问题总结
你的电子货币卡无法被NDEF_DISCOVERED检测到,核心原因是这张卡没有携带有效的NDEF格式数据,或者你的应用未配置匹配它的NDEF类型过滤规则。如果需要进一步操作这张卡,建议先确定它支持的NFC技术类型,然后通过TECH_DISCOVERED来适配。
内容的提问来源于stack exchange,提问作者SenjaKids
相关产品推荐
相关产品推荐

