4

我已经在 Nexus S 上安装了NXP TagWriterNFC TagInfo,这是用于我的 NFC 应用程序开发的同一设备。问题是我的应用程序在读取标签后没有显示在“使用完成操作”对话框中,只有从市场安装的两个都是。调试了一段时间后,我尝试使用演示应用程序,结果是一样的。我在这里想念什么?是否必须从市场上安装应用程序才能正确解析意图过滤器?

更新

我的意图过滤器很简单

<intent-filter>
  <action   android:name="android.nfc.action.TAG_DISCOVERED" />
  <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

我已经尝试按照手册中的说明,一一添加以及全部添加其他内容,但均未成功。它可能与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>
    <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>
4

2 回答 2

14

TAG_DISCOVERED 没有弹出您的应用程序的原因是因为它是备用选项:只有当找不到与 NDEF_DISCOVERED 和 TECH_DISCOVERED 意图匹配时,才会调度 TAG_DISCOVERED。

由于 NXP 应用程序注册为 TECH_DISCOVERED,因此它们将优先于您的应用程序。您包含 TECH_DISCOVERED 过滤器的解决方案是正确的,但您这样做的方式是错误的。“技术列表”块中的技术是 AND-ed 在一起的;因此在您的示例中,这意味着过滤器将仅匹配具有 NfcA AND 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 标签感兴趣,请不要声明其他标签。

于 2011-04-11T13:27:12.477 回答
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>

您的资源中可以有多个技术列表标签。仅当标签与资源中的技术列表之一匹配时,才会检测到您的应用程序。

于 2011-04-06T16:01:34.957 回答