2011-04-01 42 views
4

我在Nexus S上安装了NXP TagWriterNFC TagInfo,这是用于我的NFC应用程序开发的相同设备。问题是我的应用程序在标签读取后没有显示在“完成操作使用”对话框中,只有从市场上安装都是。调试一段时间后,我尝试使用demo application,结果是一样的。我在这里错过了什么?为了让意图过滤器正确解析,必须从市场上安装应用程序吗?来自市场的NFC应用覆盖“完成操作使用”对话条目

更新

我的意图过滤器只是

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

听起来很不自然,但ididn't不足,如果你有你的应用程序没有安装其他两个你提到你的IntentFilter工作? – codeScriber 2011-04-01 09:19:53

+0

正确的,如果安装了my和NFCDemo,将会显示My,NFCDemo和Tags对话框,如果安装了NXP TagWriter或NFC TagInfo,它们会立即运行,甚至不会预安装标签。如果两个市场都已安装,则它们都列为选项,但标签不是。 – 2011-04-01 09:25:22

+0

这确实是有用的,安装应用程序从市场到从adb或sdcard安装应用程序应该没有区别。 关于意图过滤器,你想捕捉的确切的intnet是什么/它是一个MIME类型是不同的,tagWriter具有它,但你不会被过滤掉,android给你最好的匹配,可以你是否错过了ilter参加intnet派对的小小风筝? – codeScriber 2011-04-01 10:12:27

回答

13

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

由于恩智浦应用程序注册了TECH_DISCOVERED,它们将优于您的应用程序。包含TECH_DISCOVERED过滤器的解决方案是正确的,但是您执行此操作的方式是错误的。 “技术列表”区块中的技术被联合在一起;所以在你的例子中,这意味着过滤器只会匹配具有NfcA和NfcB以及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 OR NfcB。当然,你应该尽可能准确地过滤你的过滤器,以防止应用程序列表被破坏。如果您只对NfcA标签感兴趣,请不要声称其他人。

+0

谢谢,我错过了和/或参与文件。但是,如果我尝试单独指定它们或者甚至只是我们的标签支持的那些,结果仍然是相同的。这真是令人困惑:) – 2011-04-12 07:40:48

+0

这很奇怪,你可以运行'adb logcat -s RegisteredComponentCache:*'并重新安装你的软件包?几秒钟后,您应该看到一些记录来临,表明哪种活动已经注册了哪种技术。 – 2011-04-12 08:46:46

+0

现在我觉得很蠢:)日志只显示了所有技术类型的'com.nxp.nfc.tagwriter.activities.DashboardActivity',在再次通过manifest之后,我发现了一个错字。 'intent-filter'不在活动范围内,因此未注册。但是,如果您没有提供有效的答案,我仍然没有看到它。非常感谢你:) – 2011-04-12 09:26:48

0

你的技术清单应包括技术的组合,你认为你的卡支持。例如,如果你想读的卡有NFCA,NfcB和MifareClassic那么你techlist应该有:

<tech-list> 
    <tech>android.nfc.tech.NfcA</tech> 
    <tech>android.nfc.tech.NfcB</tech> 
    <tech>android.nfc.tech.MifareClassic</tech> 
</tech-list> 

您可以在资源有一个以上的techlist标签。只有当您的资源中的某个标签与技术列表相匹配时,您的应用才能被检测到。

+0

不应该超过'tech-list'匹配那些标签吗?还是有几个需要? – 2011-04-09 11:38:30

+0

w.r.t高于技术列表,只有当它检测到NfcA,NfcB和MifareClassic时才会检测到卡。它不能是或者。 – 2013-09-11 06:18:21