NFC(Near Field Communication店归,近場(chǎng)通信),是一種數(shù)據(jù)傳輸技術(shù)揍愁。
NFC有3種工作模式:
1柏腻,讀卡器模式(Reader/writer mode)
--NFC設(shè)備讀取帶有nfc芯片的標(biāo)簽
2,仿真卡模式(Card Emulation Mode)
--NFC設(shè)備把自己模擬成nfc標(biāo)簽泉瞻,如手機(jī)成為公交卡
3脉漏, 點(diǎn)對(duì)點(diǎn)模式(P2P mode)
--如手機(jī)間傳送文件
android 在api =9時(shí)開始支持NFC功能,在api=14的時(shí)候開始可以借助藍(lán)牙傳輸大量的數(shù)據(jù)袖牙;Android SDK API主要支持NFC論壇標(biāo)準(zhǔn)(Forum Standard)侧巨,這種標(biāo)準(zhǔn)
被稱為NDEF(NFC Data Exchange Format,NFC數(shù)據(jù)交換格式)鞭达。
Android SDK API支持如下3種NDEF數(shù)據(jù)的操作司忱。
1),從NFC標(biāo)簽讀取NDEF格式的數(shù)據(jù)畴蹭。
2)坦仍,向NFC標(biāo)簽寫入NDEF格式的數(shù)據(jù)。
3)叨襟,通過(guò)Android Beam技術(shù)將NDEF數(shù)據(jù)發(fā)送到另一部NFC設(shè)備繁扎。
如果Android手機(jī)帶有NFC功能,并且NFC功能是開啟的糊闽,當(dāng)手機(jī)靠近帶有NFC芯片的標(biāo)簽時(shí)梳玫,系統(tǒng)自動(dòng)捕獲動(dòng)作,需找最適合的activity(啟動(dòng)包含這個(gè)activity的應(yīng)用)去處理右犹,匹配規(guī)則在Intent中的3種action:
1)提澎,ACTION_NDEF_DISCOVERED:當(dāng)系統(tǒng)檢測(cè)到tag中含有NDEF格式的數(shù)據(jù)時(shí),且系統(tǒng)中有activity聲明可以接受包含NDEF數(shù)據(jù)的Intent的時(shí)候念链,系統(tǒng)會(huì)優(yōu)先發(fā)出這個(gè)action的intent虱朵。
2),ACTION_TECH_DISCOVERED:當(dāng)沒有任何一個(gè)activity聲明自己可以響應(yīng)
ACTION_NDEF_DISCOVERED時(shí)钓账,系統(tǒng)會(huì)嘗試發(fā)出TECH的intent.即便你的tag中所包含的數(shù)據(jù)是NDEF的碴犬,但是如果這個(gè)數(shù)據(jù)的MIME type或URI不能和任何一個(gè)activity所聲明的想吻合,系統(tǒng)也一樣會(huì)嘗試發(fā)出tech格式的intent,而不是NDEF.
3),ACTION_TAG_DISCOVERED:當(dāng)系統(tǒng)發(fā)現(xiàn)前兩個(gè)intent在系統(tǒng)中無(wú)人會(huì)接受的時(shí)候锁荔,就只好發(fā)這個(gè)默認(rèn)的TAG類型的
除了帶有匹配的聲明還不夠滩届,還有賦予權(quán)限:
<uses-permission android:name="android.permission.NFC" />
然后是sdk支持: API>=9 ,<uses-sdk android:minSdkVersion="9"/>
如果添加了
<uses-feature android:name="android.hardware.nfc" android:required="true" />塞关,
那么只有帶有NFC功能的手機(jī)才能安裝這個(gè)應(yīng)用优妙。
如果手機(jī)中有多個(gè)activity(多個(gè)應(yīng)用)響應(yīng)這個(gè)action逻淌,android系統(tǒng)會(huì)列出所有的應(yīng)用供你選擇惜纸,為了提高匹配的準(zhǔn)確性跳纳,google提供了3種過(guò)濾條件
1)忍饰,過(guò)濾ACTION_TAG_DISCOVERED:
<intent-filter>
<action android:name="android.nfc.action.TAG_DISCOVERED"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
這個(gè)最簡(jiǎn)單,但優(yōu)先級(jí)低寺庄,最后才被處理艾蓝;
2:過(guò)濾ACTION_NDEF_DISCOVERED:
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain" />
</intent-filter>
其中最重要的應(yīng)該算是data的mimeType類型了,這個(gè)定義的越準(zhǔn)確斗塘,intent指向你這個(gè)activity的成功率就越高赢织,否則系統(tǒng)可能不會(huì)發(fā)出你想要的NDEF intent了。
3:過(guò)濾ACTION_TECH_DISCOVERED:
你首先需要在你的<project-path>/res/xml下面創(chuàng)建一個(gè)過(guò)濾規(guī)則文件馍盟。名字任取于置,比如可以叫做nfc_tech_filter.xml。這個(gè)里面定義的是nfc實(shí)現(xiàn)的各種標(biāo)準(zhǔn)贞岭,每一個(gè)nfc卡都會(huì)符合多個(gè)不同的標(biāo)準(zhǔn)八毯,個(gè)人理解為這些標(biāo)準(zhǔn)有些相互之間也是兼容的。你可以在檢測(cè)到nfc標(biāo)簽后使用getTechList()方法來(lái)查看你所檢測(cè)的tag到底支持哪些nfc標(biāo)準(zhǔn)瞄桨。
一個(gè)nfc_tech_filter.xml中可以定義多個(gè)<tech-list>結(jié)構(gòu)組话速。每一組代表我聲明我只接受同時(shí)滿足這些標(biāo)準(zhǔn)的nfc標(biāo)簽。比如A組表示讲婚,只有同時(shí)滿足IsoDep,NfcA,NfcB,NfcF這四個(gè)標(biāo)準(zhǔn)的nfc標(biāo)簽的intent才能進(jìn)入尿孔。A與B組之間的關(guān)系就是只要滿足其中一個(gè)就可以了俊柔。換句話說(shuō)筹麸,你的nfc標(biāo)簽技術(shù),滿足A的聲明也可以雏婶,滿足B的聲明也可以物赶。
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<tech-list> --------------------------------A組
<tech>android.nfc.tech.IsoDep</tech> <tech>android.nfc.tech.NfcA</tech> <tech>android.nfc.tech.NfcB</tech> <tech>android.nfc.tech.NfcF</tech>
</tech-list>
<tech-list>-----------------------------------------B組
<tech>android.nfc.tech.NfcV</tech> <tech>android.nfc.tech.Ndef</tech> <tech>android.nfc.tech.NdefFormatable</tech> <tech>android.nfc.tech.MifareClassic</tech> <tech>android.nfc.tech.MifareUltralight</tech>
</tech-list>
</resources>
在androidManifest文件中聲明xml過(guò)濾的舉例如下
<activity>
<intent-filter>
<action android:name="android.nfc.action.TECH_DISCOVERED"/>
</intent-filter>
<meta-data android:name="android.nfc.action.TECH_DISCOVERED" android:resource="@xml/nfc_tech_filter" />-------------這個(gè)就是你的資源文件名
</activity>