2

我希望我的应用拦截手机发现的所有标签。这样我想检查标签的 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 标签应用程序被启动。

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

4

2 回答 2

7

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

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

等等。这 ORs 您想要的不同标签。(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 记录)。对于那些,如果有一个特定的应用程序针对它,除非你知道它并内置它,否则你将无法保证你的应用程序将被启动。此外,对于 Ndef 标签(Mime 或 URI,但不能同时使用),我从来没有能够拥有一个以上的意图过滤器。但这可能是我不够努力。

如果另一个应用程序尝试做同样的事情(捕获尽可能多的标签),你总是会被调用。因此,除非您在手机上拥有唯一的应用程序,否则无法捕获每个标签。但是像上面看到的那样格式化你的技术列表代码会让你更接近。

于 2012-01-26T01:03:54.490 回答
2

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

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

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

于 2012-01-26T20:03:35.333 回答