Android上NFC應用_API介紹_第1頁
Android上NFC應用_API介紹_第2頁
Android上NFC應用_API介紹_第3頁
Android上NFC應用_API介紹_第4頁
Android上NFC應用_API介紹_第5頁
已閱讀5頁,還剩4頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Android上NFC應用分類:AndroidAP安全2011-06-1409:18633人閱讀評論(0)收藏舉報NFC(NearFieldCommunication)近距離通信技術NFC是一套短距離的無線通信,通常距離是4厘米或更短。NFC工作頻率是13.56MHz,傳輸速率是106kbit/s到848kbit/s.NFC總是在一個發起者和一個被動目標之間發生。發起者發出近場無線電波,這個近場可以給被動目標供電。這些被動的目標包括不需要電源的標簽,卡,也可以是有電源的設備。與其他無線通信技術比較,例如藍牙和WiFi,NFC提供更低貸款和距離,并且低成本,不需要供電,不需要實現匹配,整個通信過

2、程僅僅是短短的靠近一秒就能完成。一個帶有NFC支持的android設備通常是一個發起者。也可以作為NFC的讀寫設備。他將檢測NFCtags并且打開一個Activity來處理.Android2.3.3還有支持有限的P2P。Tags分很多種,其中簡單的只提供讀寫段,有的只能讀。復雜的tags可以支持一些運算,加密來控制對tags里數據段的讀寫。甚至一些tags上有簡單的操作系統,允許一些復雜的交互和可以執行一些代碼。API概覽Android.nfcpackage包含頂層類用來與本地NFC適配器交互.這些類可以表示被檢測到的tags和用NDEF數據格式。classDescriptionNfcMana

3、ger一個NFCadapter的管理器,可以列出所有此android設備支持的NFCadapter,只不過大部分android設備只有一個NFCadapter,所以你大部分情況下可以直接用靜態方法getDefaultAdapter(context)來取適配器。NfcAdapter表示本設備的NFCadapter,可以定義Intent來請求將系統檢測到tags的提醒發送到你的Activity,并提供方法去注冊前臺tag提醒發布和前臺NDEF推送。前臺NDEF推送是當前android版本唯一支持的p2pNFC通信方式。NdefMessageandNdefRecordNDEF是NFC論壇定義的數據結

4、構,用來有效的存數據到NFCtags,比如文本,URL,和其他MIME類型。一個NdefMessage扮演一個容器,這個容器存哪些發送和讀到的數據。一個NdefMessage對象包含0或多個NdefRecord,每個NDEFrecord有一個類型,比如文本,URL,智慧型海報/廣告,或其他MIME數據。在NDEFMessage里的第一個NfcRecord的類型用來發送tag到一個android設備上的activity.Tag標示一個被動的NFC目標,比如tag,card,鑰匙掛扣,甚至是一個電話模擬的的NFC卡.當一個tag被檢測到,一個tag對象將被創建并且封裝到一個Intent里,然后NF

5、C發布系統將這個Intent用startActivity發送到注冊了接受這種Intent的activity里。你可以用getTechList()方法來得到這個tag支持的技術細節和創建一個android.nfc.tech提供的相應的TagTechnology對象。android.nfc.techpackage包含那些對tag查詢屬性和進行I/O操作的類。這些類分別標示一個tag支持的不同的NFC技術標準。ClassTagTechnologyDescription這個接口是下面所有tagtechnology類必須實現的NfcA支持ISO14443-3A標準的操作。Providesaccessto

6、NFC-A(ISO14443-3A)propertiesandI/Ooperations.NfcBProvidesaccesstoNFC-B(ISO14443-3B)propertiesandI/Ooperations.NfcFProvidesaccesstoNFC-F(JIS6319-4)propertiesandI/Ooperations.NfcVProvidesaccesstoNFC-V(ISO15693)propertiesandI/Ooperations.IsoDepProvidesaccesstoISO-DEP(ISO14443-4)propertiesandI/Ooperatio

7、ns.Ndef提供對那些被格式化為NDEF的tag的數據的訪問和其他操作。ProvidesaccesstoNDEFdataandoperationsonNFCtagsthathavebeenformattedasNDEF.NdefFormatable對那些可以被格式化成NDEF格式的tag提供一個格式化的操作MifareClassic如果android設備支持MIFARE,提供對MIFAREClassic目標的屬性和I/O操作。MifareUltralight如果android設備支持MIFARE,提供對MIFAREUltralight目標的屬性和I/O操作。聲明AndroidManifest

8、.xml的元素1. NFC使用元素來訪問NFC硬件:2. 最小SDK版本需要設置正確,APIlevel9只包含有限的tag支持,包括:.通過ACTION_TAG_DISCOVERED來發布Tag信息.只有通過EXTRA_NDEF_MESSAGES擴展來訪問NDEF消息.其他的tag屬性和I/O操作都不支持所以你可能想要用APIlevel10來實現對tag的廣泛的讀寫支持。3. uses-feature元素定義:你的程序可以再android市場里顯示有NFC硬件。4. NFCintentfilter告訴android系統你的activity能處理NFC數據,可以定義1個或多個intentfilt

9、er:android:resource="xml/nfc_tech_filter.xml"/>上邊3個intentfilters有優先級,更多信息可以看下面的Tag發布系統也可以看NFCDemo例子的AndroidManifest.xml來有個更深的理解。Tag發布系統當android設備掃描到一個NFCtag,通用的行為是自動找最合適的Activity會處理這個tagIntent而不需要用戶來選擇哪個Activity來處理。因為設備掃描NFCtags是在很短的范圍和時間,如果讓用戶選擇的話,那就有可能需要移動設備,這樣將會打斷這個掃描過程。你應該開發你只處理需要處理

10、的tags的Activity,以防止讓用戶選擇使用哪個Activity來處理的情況。Android提供兩個系統來幫助你正確的識別一個NFCtag是否是你的Activity想要處理的:Intent發布系統和前臺Activity發布系統。Intent發布系統檢查所有Activities的intentfilters,找出那些定義了可以處理此tag的Activity,如果有多個Activity都配置了處理同一個tagIntent,那么將使用Activity選擇器來讓用戶選擇使用哪個Activity。用戶選擇之后,將使用選擇的Activity來處理此Intent.前臺發布系統允許一個Activity覆蓋

11、掉Intent發布系統而首先處理此tagIntent,這要求你將要處理TagIntent的Activity運行在前臺,這樣當一個NFCtag被掃描到,系統先檢測前臺的Activity是否支持處理此Intent,如果支持,即將此Intent傳給此Activity,如果不支持,則轉到Intent發布系統。使用Intent發布系統Intent發布系統指定了3個intent有不同的優先級。通常當一個tag被檢測到之后,Intent就被啟動(start)了,這個啟動遵循以下行為:android.nfc.action.NDEF_DISCOVERED:這個intent是在一個包含NDEF負載的tag被檢測到

12、時啟動,這是最高優先級的intent,android系統不會讓你指定一個Intent能處理所有的NFC數據類型,必須在AndroidManifest.xml中指定與NFCtag對應的元素,這樣當掃描到的tag傳過來的數據類型與你定義的相匹配時,你的Activity就會被調用。例如想處理一個包含plaintext的NDEF_DISCOVEREDintent,你要按照如下定義AndroidManifest.xmlfile:如果NDEF_DISCOVEREDintent已經被啟動,TECH_DISCOVERED和TAG_DISCOVEREDintents將不會被啟動。假如一個未知的tag或者不包含N

13、DEF負載的tag被檢測到,此Intent就不會被啟動。android.nfc.action.TECH_DISCOVERED:如果NDEF_DISCOVEREDintent沒啟動或者沒有一個Activity的filter檢測NDEF_DISCOVERED,并且此tag是已知的,那么此TECH_DISCOVEREDIntent將會啟動.TECH_DISCOVEREDintent要求你在一個資源文件里(xml)里指定你要支持technologies列表。更多細節請看下面的Specifyingtagtechnologiestohandle.android.nfc.action.TAG_DISCOVE

14、RED:如果沒有一個activity處理.DISCOVEREDandTECH_DISCOVEREDintents或者tag被檢測為未知的,那么此Intent將會被啟動。Specifyingtagtechnologiestohandle指定處理的technologies假如彳的Activity在AndroidManifest.xml文件里聲明了處理android.nfc.action.TECH_DISCOVEREDintent,你必須創建一個Xml格式的資源文件,并加上你的activity支持的technologies到tech-list集合里。這樣你的activity將被認作能處理這些tech

15、-list的處理者,如果tag使用的technology屬于你的定義的list里,你的Activity將接收此Intent。你可以用getTechList()來獲得tag支持的technologies。例如:如果一個tag被檢測到支持MifareClassic,NdefFormatable,和NfcA,你的tech-list集合必須指定了其中的一項或者多項來保證你的Activity能處理此Intent。下面是一個資源文件例子,定義了所有的technologies.你可以根據需要刪掉不需要的項,將此文件以任意名字+.xml保存到/res/xml文件夾.android.nfc.tech.IsoDe

16、pandroid.nfc.tech.NfcAandroid.nfc.tech.NfcBandroid.nfc.tech.NfcFandroid.nfc.tech.NfcVandroid.nfc.tech.Ndefandroid.nfc.tech.NdefFormatableandroid.nfc.tech.MifareClassicandroid.nfc.tech.MifareUltralight你也可以指定多個tech-list集合,每個集合都認做獨立的。如果任何單個tech-list集合是getTechList()返回的technologies集合的子集,那么你的Activity將被認為匹

17、配了。這個還提供與'和'或操作。下面的例子表示支持NfcA和NDef的卡,或者支持NfcB和NDef的卡:android.nfc.tech.NfcAandroid.nfc.tech.Ndefandroid.nfc.tech.NfcBandroid.nfc.tech.Ndef在AndroidManifest.xml文件中,指定這個tech-list資源文件的方法是在元素中創建元素,例如下面例子:android:resource="xml/nfc_tech_filter"/>使用前臺發布系統Usingtheforegrounddispatchsystem前

18、臺發布系統允許一個Activity攔截一個tagIntent獲得最高優先級的處理,這種方式很容易使用和實現:1 .添加下列代碼到Activity的onCreate()方法里a.創建一個PendingIntent對象,這樣Android系統就能在一個tag被檢測到時定位到這個對象PendingIntentpendingIntent=PendingIntent.getActivity(this,0,newIntent(this,getClass().addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),0);b.在Intentfilters里聲明你想要處理的Inten

19、t,一個tag被檢測到時先檢查前臺發布系統,如果前臺Activity符合Intentfilter的要求,那么前臺的Activity的將處理此Intent。如果不符合,前臺發布系統將Intent轉到Intent發布系統。如果指定了null的Intentfilters,當任意tag被檢測到時,你將收到TAG_DISCOVEREDintent。因此請注意你應該只處理你想要白勺Intent。IntentFilterndef=newIntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);tryndef.addDataType("*/*");/*

20、HandlesallMIMEbaseddispatches.Youshouldspecifyonlytheonesthatyouneed.*/catch(MalformedMimeTypeExceptione)thrownewRuntimeException("fail",e);intentFiltersArray=newIntentFilterndef,;c.設置一個你程序要處理的Tagtechnologies的列表,調用Object.class.getName()方法來獲得你想要支持處理的technology類。techListsArray=newString叩newS

21、tringNfcF.class.getName();2 .覆蓋下面的方法來打開或關閉前臺發布系統。比如onPause()和onResume()方法。必須在主線程里調用enableForegroundDispatch(Activity,PendingIntent,IntentFilter,String)而且Activity在前臺(可以在onResume()里調用來保證這點)。你也要覆蓋onNewIntent回調來處理得到的NFCtag數據。publicvoidonPause()super.onPause();mAdapter.disableForegroundDispatch(this);)pu

22、blicvoidonResume()super.onResume();mAdapter.enableForegroundDispatch(this,pendingIntent,intentFiltersArray,techListsArray);)publicvoidonNewIntent(Intentintent)TagtagFromIntent=intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);/dosomethingwithtagFromIntent)SeetheForegroundDispatchsamplefromAPIDemosfort

23、hecompletesample.使用NFCtag上的數據NFCtag上的數據是以字節存放,所以你可以將其轉換成其他你想要的格式。當往tag寫東西時,你必須以字節格式來寫。Android提供API來幫助寫符合NDEF標準的信息。使用此標準能保證你白數據在往tag寫時能被所有AndroidNFC設備支持。然而,很多tag使用他們自己的標準來存儲數據,這些標準也被Android支持。但你必須自己實現協議棧來讀寫這些tag。你可以在android.nfc.tech里找到所有支持的technologies,并且可以在TagTechnology接口里對technology有個了解。這一段是簡單介紹在an

24、droid系統里怎樣使用NDEF消息。這不意味著是一個完整的NDEF功能的介紹。但標出了主要需要注意和使用的東西。為了方便使用NDEF消息,android提供NdefRecord和NdefMessage來包裝原始字節數據為NDEF消息。一個NdefMessage是保存0個或多個NdefRecords的容器。每個NdefRecord有自己的唯一類型名字格式,記錄類型和ID來與其他記錄區分開。你可以存儲不同類型的記錄,不同的長度到同一個NdefMessage。NFCtag容量的限制決定你的NdefMessage的大小。那些支持Ndef和NdefFormatable技術的tag可以返回和接受Ndef

25、Message對象為參數來進行讀寫操作。你需要創建你自己的邏輯來為其他在android.nfc.tech的tag技術實現讀寫字節的操作。你可以從NFCForum(/specs/)下載NDEF消息標準的技術文檔,比如純文本和智慧型海報.NFCDemo例子里聲明了純文本和智慧型海報的NDef消息。讀一個NFCtag當一個NFCtag靠近一個NFC設備,一個相應的Intent將在設備上被創建。然后通知合適的程序來處理此Intent。下面的方法處理TAG_DISCOVEREDintent并且使用迭代器來獲得包含在NDEFtag負載的數據NdefMessag

26、e口getNdefMessages(Intentintent)/ParsetheintentNdefMessage口msgs=null;Stringaction=intent.getAction();if(NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)Parcelable口rawMsgs=intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);if(rawMsgs!=null)msgs=newNdefMessagerawMsgs.length;for(inti=0;i<r

27、awMsgs.length;i+)msgsi=(NdefMessage)rawMsgsi;else/Unknowntagtypebyteempty=newbyte口;NdefRecordrecord=newNdefRecord(NdefRecord.TNF_UNKNOWN,empty,empty,empty);NdefMessagemsg=newNdefMessage(newNdefRecordrecord);msgs=newNdefMessage口msg;elseLog.e(TAG,"Unknownintent"+intent);finish();returnmsgs;)

28、請記住NFC設備讀到的數據是byte類型,所以你可能需要將他轉成其他格式來呈現給用戶。NFCDemo例子展示了怎樣用com.example.android.nfc.record中的類來解析NDEF消息,比如純文本和智慧型海報。寫NFCtag往NFCtag寫東西涉及到構造一個NDEF消息和使用與tag匹配的Tag技術。下面的代碼展示怎樣寫一個簡單的文本到NdefFormatabletag:NdefFormatabletag=NdefFormatable.get(t);Localelocale=Locale.US;finalbytelangBytes=locale.getLanguage().getBytes(Charsets.US_ASCII);Stringtext="Tag,you'reit!"finalbytetextBytes=text.getBytes(Charsets.UTF_8);finalintutfBit=0;finalcharstatus=(char)(utfBit+langBytes.length);finalbytedata=Bytes.concat(newbyte口(byte)status,langBytes,textBytes);NdefRecordrecord=NdefRecord(NdefRecord.TNF_WEL

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論