android NFC開(kāi)發(fā)簡(jiǎn)單入門(mén)

前言:

? ? ? ? 說(shuō)道NFC,是Near Field Communication縮寫(xiě),就是近距離無(wú)線通訊技術(shù)肘迎。NFC采用主動(dòng)和被動(dòng)兩種通信模式,工作的模式有三種甥温,讀寫(xiě)標(biāo)簽,點(diǎn)對(duì)點(diǎn)妓布,仿真卡模式姻蚓,今天我們只是簡(jiǎn)單的介紹一下讀寫(xiě)標(biāo)簽(因?yàn)槲乙呀?jīng)廢了一張公交卡了。匣沼。狰挡。。 大家在學(xué)習(xí)的時(shí)候可以去某寶買幾張NFC標(biāo)簽貼紙。加叁。)倦沧,好了下面開(kāi)始開(kāi)始介紹。

1.Android中處理NFC重要的兩個(gè)包 android.nfc 和 android.nfc.tech它匕。

2.Android SDK API支持下面3種NDEF數(shù)據(jù)的操作:

(1)從NFC標(biāo)簽讀取NDEF格式的數(shù)據(jù)展融。

(2)向NFC標(biāo)簽寫(xiě)入NDEF格式的數(shù)據(jù)。

(3)通過(guò)Android Beam技術(shù)將NDEF數(shù)據(jù)發(fā)送到另一部NFC設(shè)備豫柬。

android.nfc下面用到的類也是我們需要使用的:

(1)NdefMessage:描述NDEF格式的信息告希,實(shí)際上我們寫(xiě)入NFC標(biāo)簽的就是NdefMessage對(duì)象,所以我們可以理解為數(shù)據(jù)對(duì)象這樣就簡(jiǎn)單多了烧给。

(2)NdefRecord:描述NDEF信息的一個(gè)信息段燕偶,一個(gè)NdefMessage可能包含一個(gè)或者多個(gè)NdefRecord,也就是對(duì)象中的一個(gè)個(gè)屬性础嫡。

(3)Tag:表示一個(gè)被動(dòng)的NFC的目標(biāo)指么,tag對(duì)象將被創(chuàng)建并且封裝到一個(gè)Intent里,然后NFC 發(fā)布系統(tǒng)將這個(gè)Intent用startActivity發(fā)送到注冊(cè)了接受這種Intent的activity里驰吓。簡(jiǎn)單來(lái)說(shuō)就是比如現(xiàn)在使用的公交卡涧尿,電梯卡,就是這個(gè)Tag檬贰,里面封裝了一個(gè)tag對(duì)象姑廉,當(dāng)注冊(cè)了

(4)NfcAdapter : 表示本地設(shè)備的NFC adapter,可以定義Intent來(lái)請(qǐng)求將系統(tǒng)檢測(cè)到tags的提醒發(fā)送到你的Activity.并提供方法去注冊(cè)前臺(tái)tag提醒發(fā)布和前臺(tái)NDEF推送。

(5)NfcManager:NFC adapter的管理器翁涤,列出所有本地Android設(shè)備支持所有的NFC adapter.

但是大部分Android 設(shè)備只有一個(gè)NFC adapter桥言。

對(duì)了在這里說(shuō)下Android api版本的區(qū)別

1.API level 9以前不支持NFC,當(dāng)然現(xiàn)在市面上的系統(tǒng)基本上都是4.0以上葵礼,低版本的就暫時(shí)不考慮了号阿。

2.在API level 10實(shí)現(xiàn)對(duì)tag的廣泛的讀寫(xiě)支持。

? ? ?好了現(xiàn)在開(kāi)始上代碼以及解釋鸳粉。首先我們我們字啊Android studio開(kāi)始一個(gè)工程扔涧,在AndroidManifest清單文件里面設(shè)置項(xiàng)目權(quán)限nfc,要求當(dāng)前設(shè)備必須要有NFC芯片届谈,沒(méi)有就GG了

AndroidManifest

? ? ?定義一個(gè)基礎(chǔ)的接收nfc tag的activity枯夜,類似我們?cè)陧?xiàng)目中的基礎(chǔ)baseActivity,通常來(lái)說(shuō)為了讓我們的設(shè)備在靠近nfc標(biāo)簽的時(shí)候艰山,能夠讓我們的界面Activity調(diào)用起來(lái)湖雹,所以清單需要配置一下activity的 launchMode屬性為singletop,子類需要在onCreate方法中做Activity初始化,子類需要在onNewIntent方法中進(jìn)行NFC標(biāo)簽相關(guān)操作曙搬。當(dāng)launchMode設(shè)置為singleTop時(shí)摔吏,第一次運(yùn)行調(diào)用onCreate方法鸽嫂,第二次運(yùn)行將不會(huì)創(chuàng)建新的Activity實(shí)例,將調(diào)用onNewIntent方法所以我們獲取intent傳遞過(guò)來(lái)的tag數(shù)據(jù)操作放在onNewIntent方法中執(zhí)行征讲,如果在棧中已經(jīng)有該Activity的實(shí)例据某,就重用該實(shí)例(會(huì)調(diào)用實(shí)例的onNewIntent())。下面是baseActivity稳诚,在界面onStart的時(shí)候獲取支持的nfcadapter哗脖,同時(shí)截獲NFC消息瀑踢,通過(guò)PendingIntent調(diào)用窗口扳还。界面onResume和onPause的時(shí)候讓設(shè)備處理當(dāng)前NFC數(shù)據(jù)優(yōu)先于其他的NFC處理。

nfc的基礎(chǔ)Activity

? ? ? 現(xiàn)在我們已經(jīng)有了基礎(chǔ)的NfcBLBaseActivity,現(xiàn)在我們做一個(gè)簡(jiǎn)單的入門(mén)橱夭,我們把nfc標(biāo)簽貼近Android設(shè)備寫(xiě)入一個(gè)數(shù)據(jù)到nfc標(biāo)簽氨距,寫(xiě)入成功后把nfc標(biāo)簽移開(kāi)Android設(shè)備,然后再把demo退出到后臺(tái)棘劣,再把nfc標(biāo)簽貼近Android設(shè)備俏让,這個(gè)時(shí)候Android設(shè)備跳轉(zhuǎn)到系統(tǒng)的短信界面去。就是這樣的一個(gè)操作場(chǎng)景〔缦荆現(xiàn)在寫(xiě)一個(gè)界面繼承NfcBLBaseActivity在onNewIntent中首昔,界面打開(kāi)的時(shí)候會(huì)去結(jié)束nfc標(biāo)簽的數(shù)據(jù) 獲取tag對(duì)象,往設(shè)備里面寫(xiě)入我們的標(biāo)簽信息以便第二次打開(kāi)的時(shí)候獲取tag糙俗。


打開(kāi)系統(tǒng)短信界面BlNfcOpenMessageActivity

? ? 寫(xiě)書(shū)標(biāo)簽數(shù)據(jù)的代碼如下勒奇,獲取標(biāo)簽中獲取到的標(biāo)簽tag對(duì)象,new一個(gè)NdefMessage把我們提前定義的字符串穿進(jìn)去巧骚,看一下源碼赊颠,我們傳進(jìn)去的是系統(tǒng)短信的包名com.android.mms

? ? ? 然后獲取NdefMessage對(duì)象字節(jié)長(zhǎng)度,通過(guò)Ndef.get(Ndef 對(duì)tag查詢屬性和進(jìn)行I/O操作的類。Ndef是NFC-F (JIS 6319-4)技術(shù)標(biāo)準(zhǔn) )劈彪。判斷ndef是否為NDEF格式的標(biāo)簽竣蹦,是的話調(diào)用連接,判斷是否支持可寫(xiě)沧奴,再判斷標(biāo)簽的容量和現(xiàn)在的寫(xiě)入的數(shù)據(jù)長(zhǎng)度比較痘括,都符合的情況下開(kāi)始writeNdefMessage寫(xiě)入數(shù)據(jù)。不是NDEF格式的話滔吠,還有就是我們剛買來(lái)的的NFC的標(biāo)簽貼紙是沒(méi)有分區(qū)或者格式化纲菌,這個(gè)時(shí)候我們就需要格式化一下NdefFormatable.get(tag),判斷是否獲得了NdefFormatable格式化對(duì)象屠凶,有一些標(biāo)簽是只讀的或者不允許格式化的驰后。然后再格式化寫(xiě)入數(shù)據(jù)。好了矗愧,到此為止我們就已經(jīng)完成了nfc數(shù)據(jù)的寫(xiě)入灶芝,讀取的時(shí)候就是在onNewIntent里面獲取tag標(biāo)簽數(shù)據(jù)郑原。在設(shè)備里面有這個(gè)標(biāo)簽對(duì)象的時(shí)候,nfc標(biāo)簽再貼近設(shè)備的時(shí)候就會(huì)執(zhí)行我們想要的操作夜涕,跳轉(zhuǎn)到系統(tǒng)的短信界面犯犁,下面是數(shù)據(jù)寫(xiě)入的代碼。

public voidwriteNFCTag(Tag tag) {

if(tag ==null) {

return;

}

NdefMessage ndefMessage =newNdefMessage(newNdefRecord[]{NdefRecord

.createApplicationRecord(mNfctagName)});

//轉(zhuǎn)換成字節(jié)獲得大小

intsize = ndefMessage.toByteArray().length;

try{

//判斷NFC標(biāo)簽的數(shù)據(jù)類型(通過(guò)Ndef.get方法)

Ndef ndef = Ndef.get(tag);

//判斷是否為NDEF標(biāo)簽

if(ndef !=null) {

ndef.connect();

//判斷是否支持可寫(xiě)

if(!ndef.isWritable()) {

return;

}

//判斷標(biāo)簽的容量是否夠用

if(ndef.getMaxSize() < size) {

return;

}

//3.寫(xiě)入數(shù)據(jù)

ndef.writeNdefMessage(ndefMessage);

Toast.makeText(this,"寫(xiě)入數(shù)據(jù)成功",Toast.LENGTH_SHORT).show();

}else{//當(dāng)我們買回來(lái)的NFC標(biāo)簽是沒(méi)有格式化的女器,或者沒(méi)有分區(qū)的執(zhí)行此步

//Ndef格式類

NdefFormatable format = NdefFormatable.get(tag);

//判斷是否獲得了NdefFormatable對(duì)象酸役,有一些標(biāo)簽是只讀的或者不允許格式化的

if(format !=null) {

//連接

format.connect();

//格式化并將信息寫(xiě)入標(biāo)簽

format.format(ndefMessage);

Toast.makeText(this,"寫(xiě)入數(shù)據(jù)成功",Toast.LENGTH_SHORT).show();

}else{

Toast.makeText(this,"寫(xiě)入數(shù)據(jù)失敗",Toast.LENGTH_SHORT).show();

}

}

}catch(Exception e) {

}

}

? ? ? ?截圖就不上傳了,因?yàn)橹皇菍?xiě)了一下入門(mén)的小demo驾胆,分享下自己所得涣澡,感謝大家的閱讀,語(yǔ)言組織不合適的地方還請(qǐng)包涵,謝謝丧诺。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末入桂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子驳阎,更是在濱河造成了極大的恐慌抗愁,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呵晚,死亡現(xiàn)場(chǎng)離奇詭異蜘腌,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)饵隙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)撮珠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人癞季,你說(shuō)我怎么就攤上這事劫瞳。” “怎么了绷柒?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵志于,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我废睦,道長(zhǎng)伺绽,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任嗜湃,我火速辦了婚禮奈应,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘购披。我一直安慰自己杖挣,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布刚陡。 她就那樣靜靜地躺著惩妇,像睡著了一般株汉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上歌殃,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天乔妈,我揣著相機(jī)與錄音,去河邊找鬼氓皱。 笑死路召,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的波材。 我是一名探鬼主播股淡,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼各聘!你這毒婦竟也來(lái)了揣非?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤躲因,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后忌傻,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體大脉,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年水孩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了镰矿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡俘种,死狀恐怖秤标,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宙刘,我是刑警寧澤苍姜,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站悬包,受9級(jí)特大地震影響衙猪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜布近,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一垫释、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧撑瞧,春花似錦棵譬、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)琅束。三九已至,卻和暖如春算谈,著一層夾襖步出監(jiān)牢的瞬間涩禀,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工然眼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留艾船,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓高每,卻偏偏與公主長(zhǎng)得像屿岂,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鲸匿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容