Android NFC:拦截所有标签

Ban*_*ane 2 android rfid nfc android-intent

我希望我的应用程序拦截手机发现的所有标签.这样我想检查标签的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"/>
Run Code Online (Sandbox Code Playgroud)

这就是我目前在清单中的内容,以及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>
Run Code Online (Sandbox Code Playgroud)

当我扫描Mifare智能卡时,我的应用程序被调用,当我使用不同的标签与恩智浦ICODE IC时,标准的Android标签应用程序启动.

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

Ben*_*ard 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>
Run Code Online (Sandbox Code Playgroud)

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

<tech-list>
    <tech>android.nfc.tech.NfcA</tech>
    <tech>android.nfc.tech.Ndef</tech>
</tech-list>
Run Code Online (Sandbox Code Playgroud)

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

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