Android所支持的NFC操作有三種模式:
1.Reader/Writer Mode:允許NFC設備讀寫一個NFC Tag或者Sticker
2.P2P Mode:允許NFC設備與另外一臺NFC設備交換數據,這種模式已經用於Android Beam中瞭
3.Card Emulation Mode:允許NFC設備自己作為一個NFC卡,作為一個拓展的NFC Reader。
使用NDEF數據的話主要有兩種情況:
1.從一個NFC Tag中讀取NDEF數據
2.發送一個NDEF數據到另外一臺設備上,通過Android Beam的方式。
通過Tag Dispatch System,可以從NFC Tag中讀取NDEF數據,當解析NFC Tag的時候,我們可以通過生命一個Intent-filter,來表明我們所感興趣的特定的數據,並且Android會啟動這個應用程序並且傳遞數據給它。
Android Beam特性允許一臺設備push一個NDEF消息通過物理碰撞到另外一個設備上,而隻要當手機處於解鎖狀態下時,Tag Dispatch System就會運行的,除非把NFC功能關掉瞭。
當Tag Dispatch System檢測到瞭Tag碰撞的時候,就會啟動最符合該Tag標準的Activity,由於設備發現搜索的NFC Tag會在一個很短的距離內,所以盡量隻選擇自己感興趣的Tag進行處理,而不會導致讓用戶選擇Activity。
以下為官網文檔的原話:
Because devices scan NFC tags at a very short range, it is likely that making users manually select an activity would force them to move the device away from the tag and break the connection. You should develop your activity to only handle the NFC tags that your activity cares about to prevent the Activity Chooser from appearing.
為瞭讓用戶盡可能不通過Activity Chooser進行選擇,Android 通過以下方式來定位最合適的Application:
1.解析一個NFC Tag並且parse出Data payload中能夠被唯一標識的MIME Type以及URI來決定這個Tag。
2.將解析出來的MIME Type與URI以及Data payload放入一個Intent對象中。
3.基於這個Intent啟動Activity。
一個NDEFMessage中可能會包含很多個NDEFRecord,Android也支持其他的不包含NDEF數據的Tag,通過android.nfc.tech包可以找到。而與這些對應的NFC Tag Technology要有數據交互的話,就需要自己實現與他們通信的協議棧與其通信,所以Android建議盡量使用NDEF數據格式,因為更易於開發以及Android手機的支持。
Working with these other types of tags involves writing your own protocol stack to communicate with the tags, so we recommend using NDEF when possible for ease of development and maximum support for Android-powered devices。
為瞭Parse出NDEF數據的URI和MIME Type,系統會讀取第一個NdefRecord,而第一個NdefRecord屬性為:
1.3-bit TNF(Type Name Format):
TNF_ABSOLUTE_URI:如果為此值的話,那麼就說明有一個特定的URI。
TNF_EMPTY:返回到ACTION_TECH_DISCOVERED
TNF_EXTERNAL_TYPE:拓展的URI
TNF_MIME_MEDIA:基於此類型的MIME TYPE
TNF_UNCHANGED:返回到ACTION_TECH_DISCOVERED
TNF_UNKNOWN:返回到ACTION_TECH_DISCOVERED
TNF_WELL_KNOWN:已經有,但是需要比對RTD(Record Type Definition)來確定。
對於TNF_WELL_KNOW這種類型的TNF的話,就需要來比較RTD來確定MIME TYPE以及URI瞭。