官方文檔:https://developer.android.google.cn/guide/topics/connectivity/nfc/nfc.html
前言:NFC(Near Field Communication 近場通訊),它是前幾年逐漸起來的一種技術(shù)伶跷,出來之后啄枕,感覺一直不溫不火的樣子猬膨。直到最近有個朋友需要手機(jī)與nfc標(biāo)簽讀寫信息,讓我?guī)兔Γ圆帕私膺@門技術(shù)硬爆,下面我們一起來了解并學(xué)習(xí)一下爸黄。
一滞伟、近場通訊
大家都知道android近場通訊包括我們最熟知的wifi,藍(lán)牙炕贵,還有已經(jīng)慢慢消失的紅外梆奈,最后就是我們今天的主角nfc了,nfc與其他通信類型不同的是要求距離不能超過4cm(不同的nfc標(biāo)簽略有差別)称开,查看官方文檔亩钟,我們知道nfc通信的模式有一下三種:
讀卡器模式(Reader/Writer Mode)
仿真卡模式(Card Emulation Mode)
點(diǎn)對點(diǎn)模式(P2P Mode)
二、nfc標(biāo)簽
今天主要講的是讀寫模式鳖轰,在開始寫代碼之前清酥,有必要了解nfc的標(biāo)簽調(diào)度系統(tǒng),標(biāo)簽調(diào)度系統(tǒng)如何解析NFC標(biāo)簽和特殊的工作蕴侣,當(dāng)它檢測到NDEF消息的標(biāo)記調(diào)度系統(tǒng)一樣焰轻。NFC標(biāo)簽來在廣泛的技術(shù)和還可以有許多不同的方式寫入到其中的數(shù)據(jù)。機(jī)器人具有用于NDEF標(biāo)準(zhǔn)NDEF數(shù)據(jù)被封裝的消息(內(nèi)部NdefMessage)昆雀,其中包含一個或多個記錄(NdefRecord)鹦马。每個NDEF記錄必須根據(jù)您要創(chuàng)建的記錄類型的規(guī)格良好的。Android版 ??還支持其它類型的標(biāo)簽不包含NDEF的數(shù)據(jù)忆肾,您可以通過在使用類的工作android.nfc.tech包荸频。要了解更多有關(guān)這些技術(shù),請參閱高級NFC主題客冈。這些其他類型的標(biāo)簽工作包括編寫你自己的協(xié)議棧與標(biāo)簽進(jìn)行通信旭从,因此,我們建議使用NDEF在可能的情況,便于開發(fā)和最大支持Android的供電設(shè)備和悦。
現(xiàn)在退疫,你有NFC標(biāo)簽的背景,下面的章節(jié)詳細(xì)描述了Android的如何處理NDEF格式化的標(biāo)簽鸽素。
當(dāng)一個Android設(shè)備掃描包含NDEF格式的數(shù)據(jù)的NFC標(biāo)簽褒繁,它解析該消息并試圖找出數(shù)據(jù)的MIME類型或標(biāo)識的URI。要做到這一點(diǎn)馍忽,系統(tǒng)讀取所述第一[NdefRecord(https://developer.android.google.cn/reference/android/nfc/NdefRecord.html)
內(nèi)部的[NdefMessage](https://developer.android.google.cn/reference/android/nfc/NdefMessage.html)棒坏,以確定如何解釋整個NDEF消息(一個NDEF消息可以有多個NDEF記錄)。
在一個結(jié)構(gòu)良好的NDEF消息遭笋,第一個[NdefRecord(https://developer.android.google.cn/reference/android/nfc/NdefRecord.html)
包含以下字段:
3-bit TNF (Type Name Format) :指示如何解釋可變長度類型字段
![0HF]EHB8]IQN5AC1BFIAY3M.png](http://upload-images.jianshu.io/upload_images/3287039-406ac40629b31ff6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
Variable length type:描述了記錄的類型坝冕。如果使用TNF_WELL_KNOWN,使用此字段指定記錄類型定義(RTD)
Variable length payload:要讀取或?qū)懭氲膶?shí)際數(shù)據(jù)的有效載荷瓦呼。一個NDEF消息可以包含多個NDEF記錄喂窟,所以不承擔(dān)全部有效載荷在NDEF消息的第一NDEF紀(jì)錄。
三:nfc分發(fā)
說了這么多央串,Android系統(tǒng)是怎么檢測到nfc靠近并通知相應(yīng)的應(yīng)用程序呢磨澡?其實(shí)就是用的Intent Filter,當(dāng)我們在AndroidManifest.xml的activity中注冊了相應(yīng)的nfc intent后,當(dāng)有相應(yīng)的action來臨時质和,系統(tǒng)就會把nfc分發(fā)到該App中钱贯,如果有多個App符合要求,則系統(tǒng)會彈出對話框讓用戶選擇侦另。標(biāo)簽調(diào)度系統(tǒng)定義了三個意圖秩命,優(yōu)先級從高到低如下:
1.ACTION_NDEF_DISCOVERED:
本意圖是用來啟動一個活動時,它包含一個NDEF凈荷標(biāo)簽的掃描和是一個公認(rèn)的類型褒傅。
這是最高優(yōu)先級的意圖弃锐,并且標(biāo)簽調(diào)度系統(tǒng)嘗試盡可能任何其他意圖,之前啟動這一意圖的活動殿托。
2.ACTION_TECH_DISCOVERED:
如果沒有App注冊過ACTION_NDEF_DISCOVERED霹菊,標(biāo)簽調(diào)度系統(tǒng)試圖啟動與此意向的應(yīng)用程序。此意向也直接啟動(不啟動ACTION_NDEF_DISCOVERED在前)支竹,如果被掃描的標(biāo)簽包含無法映射到MIME類型或URI旋廷,或者如果標(biāo)簽不包含NDEF數(shù)據(jù),但是是一個已知的標(biāo)簽技術(shù)NDEF數(shù)據(jù)礼搁。
3.ACTION_TAG_DISCOVERED:
如果沒有活動處理這一意圖已啟動ACTION_NDEF_DISCOVERED或ACTION_TECH_DISCOVERED意圖饶碘。
標(biāo)簽調(diào)度系統(tǒng)工作的基本方法如下:
1.嘗試啟動與由標(biāo)簽調(diào)度系統(tǒng)解析NFC標(biāo)簽時(無論是創(chuàng)建一個意圖活動ACTION_NDEF_DISCOVERED或ACTION_TECH_DISCOVERED)。
2.如果這一意圖沒有活動過濾器馒吴,嘗試下一個優(yōu)先級最低的意圖(無論是啟動一個活動ACTION_TECH_DISCOVERED或ACTION_TAG_DISCOVERED扎运,直到意圖或直至標(biāo)簽調(diào)度系統(tǒng)中的應(yīng)用程序過濾器嘗試所有可能的目的瑟曲。
3.如果沒有應(yīng)用程序篩選任何意圖的,什么也不做豪治。
只要有可能洞拨,以NDEF消息和工作ACTION_NDEF_DISCOVERED的意圖,因?yàn)樗亲钐囟ǔ龅娜齻€负拟。
此意向烦衣,您可以在比其他兩個意圖更適當(dāng)?shù)臅r間啟動應(yīng)用程序,給用戶更好的體驗(yàn)掩浙。