在新版本的android中,近場通訊已經被支持。所謂近場通訊(NFC),又稱近距離無線通信,是一種短距離的高頻無線通信技術,允許電子設備之間進行 近距離的(10釐米)非接觸式點對點傳輸,NFC由非接觸式射頻識別(RFID)及互聯互通技術整合演變而來,實現了在單一芯片上結合感應式讀卡器、感應 式卡片和點對點功能,能在短距離內與兼容設備進行設別和數據交換。NFC在最初僅僅是對RFID技術和網絡技術的簡單合併,但是在現在已經演變成爲一種短 距離無線通信技術,發展態勢相當迅速。
與RFID不同的是,NFC具有雙向識別和連接的特點,工作於13.56MHz頻率範圍,NFC採取了獨特的信號衰減技術,相對於RFID來說NFC具有距離近、帶寬高、能耗低等特點。
NFC與藍牙相比較,它不需要複雜設置程序,也可以簡化藍牙連接。NFC略勝藍牙的地方在於設置程序較短,但是無法達到藍牙的低功率。他的最大數據傳輸量 是424kbit/s遠小於藍牙v2.1的2.1Mbit/s。雖然NFC在傳輸速度與距離比不上藍牙,但是由於NFC技術不需要電源,對於移動電話和消 費性電子產品來說,這種技術的使用比較方便。它的短距離通信特徵正是其優點,由於耗電量低、一次只和一臺機器連接,因此其擁有較高的保密性與安全 性,NFC有利於信用卡交易時避免被盜用。NFC的目標並非是取代藍牙等其他無線技術,而是在不同的場合、不同的領域起到相互補充的作用。
不過雖然Android系統已經提供了關於RFC的API,但是跟藍牙和wifi一樣,它必須有硬件的支持。在實際硬件的支持上面,現在的情況還不是很普 及,前些日子有新聞稱google將在紐約和舊金山測試NFC支付,而iPhone 5據說還是不會集成NFC的功能,Android方面,google早在Nexus S上就已經內置了NFC。
NFC通信總是涉及了一個發起設備和一個目標設備,可以理解爲一個閱讀器和一個標籤設備,閱讀器可以產生一個射頻場用來給一個標籤提供電源,正是這個類似 於RFID的特性使得一個NFC的標籤設備可以做成是一個簡單的標籤、卡片的無源的形式。另外,當通信的雙方都開啓了閱讀器的情況下,也可以通過RFC建 立起點到點的通信。
一個擁有NFC硬件支持的Android設備典型的設置是在屏幕未鎖的狀態下工作在NFC通信的發起設備模式,這個模式就是通常所說的標籤讀寫器。工作在 這個模式下的Android設備將會主動的去搜尋有效範圍內的NFC標籤,並且在適當的時候對這些搜尋到的標籤進行處理工作。Android 2.3.3版本下還加入了少量的對NFC的P2P方面的支持。
NFC的標籤有很多種不同的種類,包括了各種複雜程度,隨着複雜程度的不同,它們所存儲的信息量及種類也有所不同,例如某些簡單的標籤僅僅提供了供讀寫的 語義,並且只提供了小塊一次性寫入的只讀存儲;而一些稍微複雜一點的標籤還提供了一些數學運算的功能,支持加密從而可以進行身份驗證功能;最複雜的標籤上 面還可以包括操作環境,允許在標籤上面執行代碼並且進行復雜的交互。
下一次開始具體學習Android爲NFC提供的API。
Android NFC API概述
Android中提供的與NFC相關的較高層的類都包含在android.nfc中,這個包中包含了用於與本地NFC適配器交互的類,用於代表已經識別的標籤的類以及用來使用NDEF(Nfc Data Exchange Format )格式的類。
這個包中主要包括瞭如下幾個類:
類名 | 描述 |
---|---|
NfcManager | NFC的一個高級管理類,用於枚舉出本機的NFC適配器。由於大多數的設備都只提供一個NFC適配器,因此在大多數情況下我們可以通過getDefaultAdapter(Context)這個靜態的方法來得到本地的NFC適配器的引用。 |
NfcAdapter | 該類代表了本地的NFC適配器。它定義瞭如何將NFC標籤的信息傳達給Activity的intent,並且提供了用於註冊前臺標籤調度和前臺的數據推送的方法。前臺的基於NDEF的數據推送是目前Android僅提供的點到點支持方式。 |
NdefMessage and NdefRecord | NDEF是由NFC 論壇所定義的一種數據結構,它是爲了高效率的在NFC標籤上存儲數據,例如文本、url或者其他的數據格式。NdefMessage是用於封裝需要傳輸或 讀取的數據的容器。而每一個NdefMessage包含了0個或若干個NdefRecord。每個NDEF的記錄都包括一種有效類型的數據。在一條 NDEF消息中的第一個記錄的作用是向android的Activity調度一個標籤。 |
Tag | 該類代表了一個無源的NFC標籤。這種標籤可以來自於各種物體,比如通常所用的物理標籤、卡片、鑰匙卡或者也 可以是一部可以仿真成NFC標籤的電話機。當NFC識別設備發現了一個NFC標籤,系統就會創建一個NFC Tag對象並在對象中封裝一個intent。然後NFC的標籤調度系統將會負責將這些intent調度到適當的Activity中。可以通 過 getTechList() 方法來決定使用適合該Tag對象的讀寫標準並且可以使用 android.nfc.tech包所提供的相關類來創建與此 相關的 TagTechnology 對象。 |
Android.nfc.tech包主要是包括了一些用於查詢特定標籤的特性和I/O操作的類。所有的這些類都需要實現TagTechnology接口, 它們包括NfcA、NfcB、NfcF、NfcV、IsoDep、Ndef、NdefFormtable、MifareClassic、 MifareUltralight這幾個類。
Android與NFC相關的類大致就是如上幾個,下面我們簡單的瞭解一下如何開始NFC的編程。
根據Android系統所遵循的權限機制,我們需要在AndroidManifest.xml中對需要使用的權限進行聲明,這樣在程序進行安裝時將會提示 用戶該程序將會使用到哪些設備,讓用戶來決定是否賦予應用程序相應的權限,Android通過這樣的機制來提高系統的安全性。因此當我們在應用程序中需要 使用到NFC硬件的時候,我們應當在AndroidManifest.xml中加上:
1
|
< uses-permission android:name = "android.permission.NFC" /> |
另外還需要聲明的是能夠支持應用程序的最低SDK版本,由於對NFC的支持是在API 10以後才比較完善,因此我們需要使用:
1
|
< uses-sdk android:minSdkVersion = "10" /> |
android的應用程序都是通過上傳到Android Market上供用戶下載的,我們可以通過加入如下一段聲明使我們的應用程序能夠被歸類到“支持NFC”的手機型號中:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
< uses-feature android:name = "android.hardware.nfc" android:required = "true" />1 < p style = "text-indent: 2em;" >最後,我們可以通過聲明一些intent filter來告訴操作系統該Activity可以處理NFC數據,有三種聲明的方式: 1 < intent-filter > < action android:name = "android.nfc.action.NDEF_DISCOVERED" /> < data android:mimeType = "mime/type" /> </ intent-filter > < intent-filter > < action android:name = "android.nfc.action.TECH_DISCOVERED" /> < meta-data android:name = "android.nfc.action.TECH_DISCOVERED" android:resource = "@xml/nfc_tech_filter.xml" /> </ intent-filter > < intent-filter > < action android:name = "android.nfc.action.TAG_DISCOVERED" /> </ intent-filter > |
這三種intent filter的聲明方式使用在特定的情況下。因此我們需要通過分析具體的應用程序來決定使用哪一種方式。具體怎麼選擇將在後面提到(標籤調度系統)。
這裏我們可以看一看一個完整的AndroidManifest.xml例子,取自於NFCDemo。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
<? xml version = "1.0" encoding = "utf-8" ?> package = "com.example.android.nfc" > < uses-permission android:name = "android.permission.NFC" /> < uses-permission android:name = "android.permission.CALL_PHONE" /> < application android:icon = "@drawable/icon" android:label = "@string/app_name" > < activity android:name = ".simulator.FakeTagsActivity" android:theme = "@android:style/Theme.NoTitleBar" > < intent-filter > < action android:name = "android.intent.action.MAIN" /> < category android:name = "android.intent.category.LAUNCHER" /> </ intent-filter > </ activity > < activity android:name = "TagViewer" android:theme = "@android:style/Theme.NoTitleBar" > < intent-filter > < action android:name = "android.nfc.action.TAG_DISCOVERED" /> < category android:name = "android.intent.category.DEFAULT" /> </ intent-filter > </ activity > </ application > < uses-sdk android:minSdkVersion = "9" /> < uses-feature android:name = "android.hardware.nfc" android:required = "true" /> </ manifest > |