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

Dav*_*dža 4 android nfc android-intent

我在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>
Run Code Online (Sandbox Code Playgroud)

我已经尝试添加手册中指定的其他内容,一个接一个以及所有内容都没有成功.它可能与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
Run Code Online (Sandbox Code Playgroud)

看到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" />
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

小智 14

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>
Run Code Online (Sandbox Code Playgroud)

这将匹配NfcA或NfcB.当然,您应该使过滤器尽可能准确,以防止应用程序列表崩溃.如果您只对NfcA标签感兴趣,请不要声明其他标签.