适用于所有类型的Android NFC Intent过滤器

时间:2015-03-03 17:18:55

标签: android android-intent nfc intentfilter ndef

我想创建一个Android应用程序来处理所有类别和所有数据类型的NDEF,TECH和TAG等所有NFC事件。

这些意图过滤器位于我的Android Manifest文件中:

<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    <action android:name="android.nfc.action.TECH_DISCOVERED" />
    <action android:name="android.nfc.action.TAG_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

当事件为TAG_DISCOVERED时,此代码有效。 NDEF_DISCOVERED不会调用我的应用程序。

有人能发现我做错了吗?

2 个答案:

答案 0 :(得分:5)

您的意图过滤器

<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    <action android:name="android.nfc.action.TECH_DISCOVERED" />
    <action android:name="android.nfc.action.TAG_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

没有多大意义,因为NFC的意图调度工作原理(见How NFC Tags are Dispatched to Applications

  1. TAG_DISCOVERED(在清单中使用时)只有在没有应用注册TECH_DISCOVEREDNDEF_DISCOVERED意图时才会被触发匹配标签。因此,如果您还打算注册您的应用以处理所有TECH_DISCOVEREDNDEF_DISCOVERED意图,则通常无需注册TAG_DISCOVERED

  2. NDEF_DISCOVERED意图过滤器需要(在许多平台版本/设备上,某些选项上是可选的)您想要侦听的其他数据类型(请参阅{{3} })。没有全能NDEF_DISCOVERED意图过滤器(尽管你可以通过使用TECH_DISCOVERED来接近Ndef和NdefFormatable技术)。 NDEF_DISCOVERED只会匹配最具体的意图过滤器。例如,如果您注册所有以“http://”开头的网址,则注册以“<data ... />”开头的网址的任何应用都将优先于您的应用。因此,您需要注册无限数量的数据类型才能优先于所有其他应用程序。

  3. TECH_DISCOVERED意图过滤器需要您想要监听的标记技术的其他定义(请参阅http://www.example.com/LaurentY)。可用的技术是名称空间android.nfc.tech.*中的技术,目前是:

    android.nfc.tech.IsoDep
    android.nfc.tech.MifareClassic
    android.nfc.tech.MifareUltralight
    android.nfc.tech.Ndef
    android.nfc.tech.NdefFormatable
    android.nfc.tech.NfcA
    android.nfc.tech.NfcB
    android.nfc.tech.NfcBarcode
    android.nfc.tech.NfcF
    android.nfc.tech.NfcV
    

    您可以在XML文件中指定它们。例如,要匹配所有NfcA和所有NfcB标记,您可以在名为xml/nfc_tech_filter.xml的文件中使用它:

    <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
        <tech-list>
            <tech>android.nfc.tech.NfcA</tech>
        </tech-list>
        <tech-list>
            <tech>android.nfc.tech.NfcB</tech>
        </tech-list>
    </resources>
    

    然后,您可以使用<meta-data>标记附加此XML文件(<activity>标记内但 <intent-filter>标记:

    <meta-data android:name="android.nfc.action.TECH_DISCOVERED"
               android:resource="@xml/nfc_tech_filter" />
    

答案 1 :(得分:0)

您必须创建多个intent-filter:

<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
</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/filter_nfc" />
<intent-filter>
    <action android:name="android.nfc.action.TAG_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

对于TECH_DISCOVERED,您必须创建一个XML资源文件,该文件指定您的活动在技术列表集中支持的技术,如下所述:http://developer.android.com/guide/topics/connectivity/nfc/nfc.html#tech-disc