天天看點

Android NFC簡介 部落格分類: Android android nfc 近場通信

目錄:

Android NFC . 1

1 簡介 ... 1

1.1 什麼是 NFC . 1

1.2 Android 上的 NFC . 2

1.3 Android 中的 NFC 通訊機制 ... 2

2 用法 ... 3

2.1 讀取 tag . 3

2.2 發送消息 ... 5

2.2.1 發送過程 ... 5

2.2.2 NDEF 消息格式 ... 6

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 文檔了。