目錄:
1 簡介
1.1 什麼是 NFC
近場通訊 (Near Filed Communication) 技術是一種近距離的高頻無線通信技術, 通常距離是4 釐米或更短。 NFC 工作頻率是 13.56M Hz, 傳輸速率是 106kbit/s 到 848kbit/s. NFC 總是在一個發起者和一個被動目標之間發生。發起者發出近場無線電波,這個近場可以給被動目標供電。這些被動的目標包括不需要電源的標籤,卡,也可以是有電源的設備。
與其他無線通信技術比較, 例如藍牙和 WiFi , NFC 提供更低貸款和距離,並且低成本,不需要供電,不需要實現匹配,整個通信過程僅僅是短短的靠近一秒就能完成。
1.2 Android 上的 NFC
Android 在Android 2.3(API Level 9) 中首次增加了對NFC 的支持,但是隻能讀取tag ,有很多不完善的地方。在Level 10 中增加了對tag 的寫,不過構造和解析消息都是需要自己來處理。
後來的Android 4.0 ICS(API Level 14) 中全面提升了NFC 的功能,支持兩臺NFC 手機的相互通信,並且封裝了方便的消息構造和解析接口。
Android 提供了三種級別的NFC 消息:
Ø android.nfc.action.NDEF_DISCOVERED : 由應用程序構造的NDEF (NFC Data Exchange Format :NFC 數據交換格式)消息。
Ø android.nfc.action.TECH_DISCOVERED : 現有的標準NFC 協議構造的消息。
Ø android.nfc.action.TAG_DISCOVERED :不符合前面兩種格式的消息。
1.3 Android 中的 NFC 通訊機制
首先應用程序向系統註冊感興趣的Intent ,當系統的NFC 服務收到一條tag 之後,會打開合適的應用並傳遞Intent 。如果同時有N 個應用都對這個tag 感興趣,並且都不在前臺,則系統會彈出選擇列表讓用戶選擇,如果其中某個應用在前臺,則系統直接將Intent 投遞到此應用。具體如何註冊見後面的用法。
2 用法
2.1 讀取 tag
首先,必須在manifest 中申明NFC 的權限和feature :
< uses-permission android:name = "android.permission.NFC" />
< uses-feature android:name = "android.hardware.nfc" />
如果應用必須擁有NFC 的手機才能安裝,則在 uses-feature 中加上屬性 android:required = "true" , 方便marekt 過濾。
然後註冊感興趣的Intent 。
u NDEF 格式的消息 :
這裏的data 指定了感興趣的數據類型和格式,系統會自動過濾出符合條件的Intent 。上面這個data 表示只接受純文本的數據。如果只接受 http://www.qq.com 這個網址,則data 定義如下:
注意,這個類型 < category android:name = "android.intent.category.DEFAULT" /> 要加上。
u TECH 格式的消息 :
meta-data 中的resource 指定了對使用了哪些技術的tag 感興趣。filter_nfc.xml 的內容如下:
這裏是將所有的tech 標準都放到裏面了,實際使用的時候不應如此,應該取一個或多個子集。這裏關於tech 列表的子集定義還有一些規範,網上可以查到,就不贅述。
u TAG 格式的消息 :
如此,則所有沒有被捕獲的Intent 就會發送到這裏來,算是各種未知NFC 數據的集散地。
Tag 分發系統流程圖如下:
2.2 發送消息
2.2.1 發送過程
首先取得一個NFCAdapter ,一般是使用默認的:
三個發送消息相關的API :
Ø public void setNdefPushMessage (NdefMessage message, Activity activity, Activity... activities)
設置NDEF 消息。API 文檔上說這個方法設置之後不需要讓用戶操作,設備靠近會自行發出,但是經過嘗試發現不行,也許是有什麼沒注意到的地方。
Ø public void setNdefPushMessageCallback (NfcAdapter.CreateNdefMessageCallback callback, Activity activity, Activity... activities)
設置NDEF 消息的構造器,每次構造消息都會調用callback 的createNdefMessage 方法獲取NDEF 消息。
Ø public void setOnNdefPushCompleteCallback (NfcAdapter.OnNdefPushCompleteCallback callback, Activity activity, Activity... activities)
設置NDEF 消息發送完畢之後的回調接口。
2.2.2 NDEF 消息格式
一個NdefMessage 對象是由N 個NdefRecord 組成,NdefRecord 可以根據自己的需要去定義裏面的內容,不過如果要構造公共的標準NdefRecord ,就需要查閱API 文檔了。
簡單的用法如下: