转自 http://blog.csdn.net/think_soft/article/details/8180203html
过滤NFC的Intentandroid
要在你想要处理被扫描到的NFC标签时启动你的应用程序,能够在你的应用程序的Android清单中针对一种、两种或所有三种类型的NFC的Intent来过滤。可是,一般想要在应用程序启动时控制最经常使用的ACTION_NDEF_DISCOVERED类型的Intent。在没有过滤ACTION_NDEF_DISCOVERED类型的Intent的应用程序,或数据负载不是NDEF时,才会从ACTION_NDEF_DISCOVERED类型的Intent回退到ACTION_TECH_DISCOVERED类型的Intent。一般ACTION_TAB_DISCOVERED是最通常化的过滤分类。不少应用程序都会在过滤ACTION_TAG_DISCOVERED以前,过滤ACTION_NDEF_DISCOVERED或ACTION_TECH_DISCOVERED,这样就会下降你的应用程序被启动的可能性。ACTION_TAG_DISCOVERED只是在没有应用程序处理ACTION_NDEF_DISCOVERED或ACTION_TECH_DISCOVERED类型的Intent的状况下,才使用的最后手段。.net
由于NFC标签的多样性,而且不少时候不在你的控制之下,所以在必要的时候你要回退到其余两种类型的Intent。在你可以控制标签的类型和写入的数据时,咱们建议你使用NDEF格式。下文将介绍如何过滤每种类型的Intent对象。orm
ACTION_NDEF_DISCOVEREDxml
要过滤ACTION_NDEF_DISCOVERED类型的Intent,就要在清单中跟你想要过滤的数据一块儿来声明该类型的Intent过滤器。如下是过滤text/plain类型的MIME的ACTION_NDEF_DISCOVERED类型过滤器的声明:htm
<intent-filter>对象
<action android:name="android.nfc.action.NDEF_DISCOVERED"/>blog
<category android:name="android.intent.category.DEFAULT"/>资源
<data android:mimeType="text/plain" />get
</intent-filter>
如下示例使用http://developer.android.com/index.html格式的URI来过滤:
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="http"
android:host="developer.android.com"
android:pathPrefix="/index.html" />
</intent-filter>
ACTION_TECH_DISCOVERED
若是你的Activity要过滤ACTION_TECH_DISCOVERED类型的Intent,你必须建立一个XML资源文件,该文件在tech-list集合中指定你的Activity所支持的技术。若是tech-list集合是标签所支持的技术的一个子集,那么你的Activity被认为是匹配的。经过调用getTechList()方法来得到标签所支持的技术集合。
例如,若是扫描到的标签支持MifareClassic、NdefFormatable和NfcA,那么为了跟它们匹配,tech-list集合就必须指定全部这三种技术,或者指定其中的两种或一种。
如下示例定义了全部的相关的技术。你能够根据须要删除其中一些设置。而后把这个文件保存到<project-root>/res/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>
你也可以指定多个tech-list集合,每一个tech-list集合被认为是独立的,而且若是任何一个tech-list集合是由getTechList()返回的技术的子集,那么你的Activity就被认为是匹配的。下列示例可以跟支持NfcA和Ndef技术NFC标签或者跟支持NfcB和Ndef技术的标签相匹配:
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<tech-list>
<tech>android.nfc.tech.NfcA</tech>
<tech>android.nfc.tech.Ndef</tech>
</tech-list>
</resources>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<tech-list>
<tech>android.nfc.tech.NfcB</tech>
<tech>android.nfc.tech.Ndef</tech>
</tech-list>
</resources>
在你的AndroidManifest.xml文件中,要像向下列示例那样,在<activity>元素内的<meta-data>元素中指定你建立的资源文件:
<activity>
...
<intent-filter>
<action android:name="android.nfc.action.TECH_DISCOVERED"/>
</intent-filter>
<meta-data android:name="android.nfc.action.TECH_DISCOVERED"
android:resource="@xml/nfc_tech_filter" />
...
</activity>
ACTION_TAG_DISCOVERED
使用下列Intent过滤器来过滤ACTION_TAG_DISCOVERED类型的Intent:
<intent-filter>
<action android:name="android.nfc.action.TAG_DISCOVERED"/>
</intent-filter>