Android 2.3.3 近場(chǎng)通信NFC介紹
NFC 是一套短距離的無(wú)線通信,通常距離是 4 厘米或更短。 NFC 工作頻率是 13.56M Hz, 傳輸速率是 106kbit/s 到848kbit/s. NFC 總是在一個(gè)發(fā)起者和一個(gè)被動(dòng)目標(biāo)之間發(fā)生。發(fā)起者發(fā)出近場(chǎng)無(wú)線電波,這個(gè)近場(chǎng)可以給被動(dòng)目標(biāo)供電。這些被動(dòng)的目標(biāo)包括不需要電源的標(biāo)簽,卡,也可以是有電源的設(shè)備。
與其他無(wú)線通信技術(shù)比較, 例如藍(lán)牙和 WiFi , NFC 提供更低貸款和距離,并且低成本,不需要供電,不需要實(shí)現(xiàn)匹配,整個(gè)通信過(guò)程僅僅是短短的靠近一秒就能完成。
一個(gè)帶有 NFC 支持的 android 設(shè)備通常是一個(gè)發(fā)起者。也可以作為 NFC 的讀寫設(shè)備。他將檢測(cè) NFC tags 并且打開一個(gè)Activity 來(lái)處理 . Android 2.3.3 還有支持有限的 P2P 。
Tags 分很多種,其中簡(jiǎn)單的只提供讀寫段,有的只能讀。復(fù)雜的 tags 可以支持一些運(yùn)算,加密來(lái)控制對(duì) tags 里數(shù)據(jù)段的讀寫。甚至一些 tags 上有簡(jiǎn)單的操作系統(tǒng),允許一些復(fù)雜的交互和可以執(zhí)行一些代碼。
API 概覽
Android.nfc package 包含頂層類用來(lái)與本地 NFC 適配器交互 . 這些類可以表示被檢測(cè)到的 tags 和用 NDEF 數(shù)據(jù)格式。
android.nfc.techpackage 包含那些對(duì) tag 查詢屬性和進(jìn)行 I/O 操作的類。這些類分別標(biāo)示一個(gè) tag 支持的不同的NFC 技術(shù)標(biāo)準(zhǔn)。
聲明 Android Manifest.xml 的元素
在你能訪問(wèn)一個(gè)設(shè)備的 NFC 硬件和正確的處理 NFC 的 Intent 之前,需要在 AndroidManifest.xml 中先聲明下面的項(xiàng):
1. NFC 使用 元素來(lái)訪問(wèn) NFC 硬件 :
2. 最小 SDK 版本需要設(shè)置正確, API level 9 只包含有限的 tag 支持 , 包括:
. 通過(guò) ACTION_TAG_DISCOVERED來(lái)發(fā)布 Tag 信息
. 只有通過(guò) EXTRA_NDEF_MESSAGES擴(kuò)展來(lái)訪問(wèn) NDEF 消息
. 其他的 tag 屬性和 I/O 操作都不支持
所以你可能想要用 API level 10 來(lái)實(shí)現(xiàn)對(duì) tag 的廣泛的讀寫支持。
3. uses-feature 元素定義:你的程序可以再 android 市場(chǎng)里顯示有 NFC 硬件。
4. NFC intent filter 告訴 android 系統(tǒng)你的 activity 能處理 NFC 數(shù)據(jù),可以定義 1 個(gè)或多個(gè) intent filter :
android:resource = @xml/nfc_tech_filter .xml />
上邊 3 個(gè) intent filters 有優(yōu)先級(jí),更多信息可以看下面的 Tag 發(fā)布系統(tǒng)
也可以看 NFCDemo 例子的 AndroidManifest.xml 來(lái)有個(gè)更深的理解。
Tag 發(fā)布系統(tǒng)
當(dāng) android 設(shè)備掃描到一個(gè) NFC tag ,通用的行為是自動(dòng)找最合適的 Activity 會(huì)處理這個(gè) tag Intent 而不需要用戶來(lái)選擇哪個(gè) Activity 來(lái)處理。因?yàn)樵O(shè)備掃描 NFC tags 是在很短的范圍和時(shí)間,如果讓用戶選擇的話,那就有可能需要移動(dòng)設(shè)備,這樣將會(huì)打斷這個(gè)掃描過(guò)程。你應(yīng)該開發(fā)你只處理需要處理的 tags 的 Activity ,以防止讓用戶選擇使用哪個(gè) Activity來(lái)處理的情況。 Android 提供兩個(gè)系統(tǒng)來(lái)幫助你正確的識(shí)別一個(gè) NFC tag 是否是你的 Activity 想要處理的: Intent 發(fā)布系統(tǒng)和前臺(tái) Activity 發(fā)布系統(tǒng)。
Intent 發(fā)布系統(tǒng)檢查所有 Activities 的 intent filters ,找出那些定義了可以處理此 tag 的 Activity ,如果有多個(gè) Activity 都配置了處理同一個(gè) tag Intent ,那么將使用 Activity 選擇器來(lái)讓用戶選擇使用哪個(gè) Activity 。用戶選擇之后,將使用選擇的 Activity 來(lái)處理此 Intent .
前臺(tái)發(fā)布系統(tǒng)允許一個(gè) Activity 覆蓋掉 Intent 發(fā)布系統(tǒng)而首先處理此 tag Intent ,這要求你將要處理 Tag Intent 的 Activity運(yùn)行在前臺(tái),這樣當(dāng)一個(gè) NFC tag 被掃描到,系統(tǒng)先檢測(cè)前臺(tái)的 Activity 是否支持處理此 Intent ,如果支持,即將此Intent 傳給此 Activity ,如果不支持,則轉(zhuǎn)到 Intent 發(fā)布系統(tǒng)。
使用 Intent 發(fā)布系統(tǒng)
Intent 發(fā)布系統(tǒng)指定了 3 個(gè) intent 有不同的優(yōu)先級(jí)。通常當(dāng)一個(gè) tag 被檢測(cè)到之后, Intent 就被啟動(dòng)( start )了,這個(gè)啟動(dòng)遵循以下行為 :
· android.nfc.action.NDEF_DISCOVERED : 這個(gè) intent 是在一個(gè)包含 NDEF 負(fù)載的 tag 被檢測(cè)到時(shí)啟動(dòng),這是最高優(yōu)先級(jí)的 intent, android 系統(tǒng)不會(huì)讓你指定一個(gè) Intent 能處理所有的 NFC 數(shù)據(jù)類型,你必須在AndroidManifest.xml 中指定與 NFC tag 對(duì)應(yīng)的 元素,這樣當(dāng)掃描到的 tag 傳過(guò)來(lái)的數(shù)據(jù)類型與你定義的相匹配時(shí),你的 Activity 就會(huì)被調(diào)用。例如想處理一個(gè)包含 plain text 的 NDEF_DISCOVERED intent ,你要按照如下定義AndroidManifest.xml file:
如果 NDEF_DISCOVERED intent 已經(jīng)被啟動(dòng), TECH_DISCOVERED 和 TAG_DISCOVERED intents 將不會(huì)被啟動(dòng)。假如一個(gè)未知的 tag 或者不包含 NDEF 負(fù)載的 tag 被檢測(cè)到,此 Intent 就不會(huì)被啟動(dòng)。
· android.nfc.action.TECH_DISCOVERED : 如果 NDEF_DISCOVERED intent 沒(méi)啟動(dòng)或者沒(méi)有一個(gè) Activity 的filter 檢測(cè) NDEF_DISCOVERED ,并且此 tag 是已知的,那么此 TECH_DISCOVERED Intent 將會(huì)啟動(dòng) .TECH_DISCOVERED intent 要求你在一個(gè)資源文件里 (xml) 里指定你要支持 technologies 列表。更多細(xì)節(jié)請(qǐng)看下面的Specifying tag technologies to handle .
· android.nfc.action.TAG_DISCOVERED : 如果沒(méi)有一個(gè) activity 處理 _DISCOVERED and TECH_DISCOVEREDintents 或者 tag 被檢測(cè)為未知的,那么此 Intent 將會(huì)被啟動(dòng)。
Specifying tag technologies to handle 指定處理的 technologies
假如你的 Activity 在 AndroidManifest.xml 文件里聲明了處理 android.nfc.action.TECH_DISCOVERED intent,你必須創(chuàng)建一個(gè) Xml 格式的資源文件,并加上你的 activity 支持的 technologies 到 tech-list 集合里。這樣你的 activity將被認(rèn)作能處理這些 tech-list 的處理者,如果 tag 使用的 technology 屬于你的定義的 list 里,你的 Activity 將接收此Intent 。你可以用 getTechList() 來(lái)獲得 tag 支持的 technologies 。
例如:如果一個(gè) tag 被檢測(cè)到支持 MifareClassic, NdefFormatable, 和 NfcA ,你的 tech-list 集合必須指定了其中的一項(xiàng)或者多項(xiàng)來(lái)保證你的 Activity 能處理此 Intent 。
下面是一個(gè)資源文件例子,定義了所有的 technologies. 你可以根據(jù)需要?jiǎng)h掉不需要的項(xiàng),將此文件以任意名字 +.xml 保存到 /res/xml 文件夾 .
asis:names:tc:xliff:document:1.2 >
android.nfc.tech.IsoDep
android.nfc.tech.NfcA
android.nfc.tech.NfcB
android.nfc.tech.NfcF
android.nfc.tech.NfcV
android.nfc.tech.Ndef
android.nfc.tech.NdefFormatable
android.nfc.tech.MifareClassic
android.nfc.tech.MifareUltralight
你也可以指定多個(gè) tech-list 集合,每個(gè)集合都認(rèn)做獨(dú)立的。如果任何單個(gè) tech-list 集合是 getTechList() 返回的technologies 集合的子集,那么你的 Activity 將被認(rèn)為匹配了。這個(gè)還提供 ’ 與 ’ 和 ’ 或 ’ 操作。下面的例子表示支持NfcA 和 NDef 的卡,或者支持 NfcB 和 NDef 的卡:
asis:names:tc:xliff:document:1.2 >
android.nfc.tech.NfcA
android.nfc.tech.Ndef
asis:names:tc:xliff:document:1.2 >
android.nfc.tech.NfcB
android.nfc.tech.Ndef
在 AndroidManifest.xml 文件中 , 指定這個(gè) tech-list 資源文件的方法是在 元素中創(chuàng)建 元素,例如下面例子 :
...
android:resource = @xml/nfc_tech_filter />
...
使用前臺(tái)發(fā)布系統(tǒng) Using the foreground dispatch system
前臺(tái)發(fā)布系統(tǒng)允許一個(gè) Activity 攔截一個(gè) tag Intent 獲得最高優(yōu)先級(jí)的處理,這種方式很容易使用和實(shí)現(xiàn):
1. 添加下列代碼到 Activity 的 onCreate() 方法里
a. 創(chuàng)建一個(gè) PendingIntent對(duì)象 , 這樣 Android 系統(tǒng)就能在一個(gè) tag 被檢測(cè)到時(shí)定位到這個(gè)對(duì)象
PendingIntent pendingIntent = PendingIntent . getActivity (
this , 0 , new Intent ( this , getClass ()). addFlags ( Intent .FLAG_ACTIVITY_SINGLE_TOP ), 0 );
b. 在 Intent filters 里聲明你想要處理的 Intent ,一個(gè) tag 被檢測(cè)到時(shí)先檢查前臺(tái)發(fā)布系統(tǒng),如果前臺(tái) Activity 符合Intent filter 的要求,那么前臺(tái)的 Activity 的將處理此 Intent 。如果不符合,前臺(tái)發(fā)布系統(tǒng)將 Intent 轉(zhuǎn)到 Intent 發(fā)布系統(tǒng)。如果指定了 null 的 Intent filters ,當(dāng)任意 tag 被檢測(cè)到時(shí),你將收到 TAG_DISCOVERED intent 。因此請(qǐng)注意你應(yīng)該只處理你想要的 Intent 。
p2p機(jī)相關(guān)文章:p2p原理
評(píng)論