来自市场的NFC应用程序覆盖“使用完整操作”对话框条目

时间:2011-04-01 09:12:56

标签: android android-intent nfc

我在Nexus S上安装了NXP TagWriterNFC 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>

2 个答案:

答案 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>

您的资源中可以包含多个技术列表标记。只有当标记与您资源中的某个技术列表匹配时,才会检测到您的应用。