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