Android NFC:拦截所有标签

时间:2012-01-25 19:32:42

标签: android android-intent nfc rfid

我希望我的应用拦截手机发现的所有标签。这样我想检查标签的uid并在之后传递意图(显示应用程序选择器等)。

<action android:name="android.nfc.action.NDEF_DISCOVERED"/>
<action android:name="android.nfc.action.TAG_DISCOVERED"/>
<action android:name="android.nfc.action.TECH_DISCOVERED"/>

这就是我目前在清单中的内容,以及TAG_DISCOVERED的意图过滤器:

<tech-list>
     <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.IsoDep</tech>
     <tech>android.nfc.tech.MifareClassic</tech>
     <tech>android.nfc.tech.Ultralight</tech>
     <tech>android.nfc.tech.Ndef</tech>
     <tech>android.nfc.tech.NdefFormatable</tech>
 </tech-list>

当我扫描Mifare智能卡时,我的应用程序被调用,当我使用NXP ICODE IC的不同标签时,会启动标准的Android标记应用程序。

有关我如何确保能够看到所有标签的任何提示?

2 个答案:

答案 0 :(得分:7)

首先,技术列表的工作方式是列出的所有技术都是AND,这意味着如果标签列出了所有不同的技术,意图就会传递给应用程序。我不知道有什么用。你想要做的更多是:

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

等等。这会对您想要的不同标签进行OR运算。 (NfcA或NfcB等)现在,这些技术中的一些像NfcA和Ultralight或Ndef一样。因此,如果你想要一张NfcA和Ndef卡,你可以使用

<tech-list>
    <tech>android.nfc.tech.NfcA</tech>
    <tech>android.nfc.tech.Ndef</tech>
</tech-list>

现在,与标签上的技术最匹配的应用程序将启动,或显示在选择菜单中。但是NDEF_DISCOVERED优先于TECH_DISCOVERED。现在NDEF_DISCOVERED意图启动器可以非常具体地传递什么标签。虽然某些格式的NDEF(如Mime类型)允许“捕获所有”过滤器(例如,“Mime”的“ / ”),但有些格式不允许。 (比如uri格式化的Ndef Record)。对于那些,如果有针对它的特定应用程序,除非您知道并构建它,否则您将无法保证您的应用程序将被启动。此外,我从来没有能够为Ndef标签(Mime OR URI,但不是两者)都有多个intent过滤器。但那可能是我没有努力尝试过。

如果另一个应用程序尝试执行相同操作(尽可能多地捕获标记),您将始终使用它进行调用。所以除非你手机上有唯一的应用程序,否则没有办法捕获每一个标签。但是,如上所示格式化您的技术列表代码将使您更加接近。

答案 1 :(得分:2)

理论上你可以通过前台调度来做到这一点:

http://developer.android.com/guide/topics/nfc/advanced-nfc.html#foreground-dispatch

您需要处理所有NDEF_DISCOVERED MIME类型( / ),然后处理所有TECH_DISCOVERED标记技术以及TAG_DISCOVERED意图。您的应用必须位于前台。您不能保证您的应用程序已启动,否则任何其他应用程序始终可以处理与您的应用程序相同的意图,因此活动选择器将会出现。