Android開發文檔學習:NFC(近場通訊)

在新版本的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 )格式的類。

這個包中主要包括瞭如下幾個類:

Show entries
Search: 
類名 描述
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 對象。
Showing 1 to 4 of 4 entries

 

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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章