我在Nexus S上安装了NXP TagWriter和NFC TagInfo,这是用于我的NFC应用程序开发的相同设备。问题是我的应用程序没有显示在标签读取后的“完成操作使用”对话框中,只有两个都是从市场上安装的。调试一段时间后,我尝试使用demo application,结果是一样的。我在这里错过了什么?是否必须从市场上安装应用程序才能正确解析目标过滤器?
更新
我的意图过滤器只是
<intent-filter>
<action android:name="android.nfc.action.TAG_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
我尝试按照manual中的指定添加其他内容,一个接一个地以及所有内容都没有成功。它可能与mime类型有关吗?
当读取NFC标签时,只有这两行与动作有关,而不是其他任何内容。
INFO/ActivityManager(111): Starting: Intent { act=android.nfc.action.TECH_DISCOVERED flg=0x10000000 cmp=com.nxp.nfc.tagwriter/.activities.DashboardActivity (has extras) } from pid 197
INFO/ActivityManager(111): Starting: Intent { cmp=com.nxp.nfc.tagwriter/.activities.ConfirmLicenseActivity } from pid 6250
看到android.nfc.action.TECH_DISCOVERED
被触发,我添加了以下intent-filter:
<intent-filter>
<action android:name="android.nfc.action.TECH_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT"/>
</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.IsoDep</tech>
<tech>android.nfc.tech.NfcA</tech>
<tech>android.nfc.tech.NfcB</tech>
<tech>android.nfc.tech.NfcF</tech>
<tech>android.nfc.tech.NfcV</tech>
<tech>android.nfc.tech.Ndef</tech>
<tech>android.nfc.tech.NdefFormatable</tech>
<tech>android.nfc.tech.MifareClassic</tech>
<tech>android.nfc.tech.MifareUltralight</tech>
</tech-list>
</resources>
答案 0 :(得分:13)
TAG_DISCOVERED没有弹出你的应用程序的原因是因为它是后备选项:只有当找不到NDEF_DISCOVERED和TECH_DISCOVERED意图的匹配时,才会调度TAG_DISCOVERED。
由于恩智浦应用程序注册了TECH_DISCOVERED,因此它们将优先于您的应用程序。您的解决方案包括TECH_DISCOVERED过滤器是正确的,但您的方式是错误的。 “技术列表”块中的技术是一起编辑的;所以在你的例子中,这意味着过滤器只匹配具有NfcA和NfcB AND MifareClassic的标签。由于NfcA和NfcB是不同的技术,因此这个过滤器永远不会匹配。
你真正想要的是所有不同技术的OR。为此,只需编写仅包含一种技术的多个块:
<tech-list>
<tech>android.nfc.tech.NfcA</tech>
</tech-list>
<tech-list>
<tech>android.nfc.tech.NfcB</tech>
</tech-list>
这将匹配NfcA或NfcB。当然,您应该使过滤器尽可能准确,以防止应用程序列表崩溃。如果您只对NfcA标签感兴趣,请不要声明其他标签。
答案 1 :(得分:0)
您的技术列表应包含您认为卡支持的技术组合。例如,如果您要阅读的卡有NfcA,NfcB和MifareClassic,那么您的技术列表应该具有:
<tech-list>
<tech>android.nfc.tech.NfcA</tech>
<tech>android.nfc.tech.NfcB</tech>
<tech>android.nfc.tech.MifareClassic</tech>
</tech-list>
您的资源中可以包含多个技术列表标记。只有当标记与您资源中的某个技术列表匹配时,才会检测到您的应用。