本節書摘來自異步社群《android nfc開發實戰詳解》一書中的第6章,第6.1節關于nfc p2p模式,作者 趙波,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視
6.1 關于nfc p2p模式
android nfc開發實戰詳解
p2p模式是nfc 3種模式之一(其他兩種為讀寫模式、卡模拟模式),主要完成在兩個nfc裝置之間資料的傳遞,傳輸的一方同時也可以是接收對方的資料。p2p模式在android2.3.3+(api 10)中開始加入,其采用的是foreground ndef push的方法,在android4.0 +(api 14)後又重新提供了一套新的api函數(又稱為beam)。對于上述兩種方式,在本章中為大家進行詳細介紹。
注意,android nfc p2p功能是在api 10以後版本中才加入的,這與android nfc讀寫模式開發稍有不同(其在api 9中開始加入)。是以,在android api 9中,可以進行nfc讀寫tag的應用開發,但p2p功能的開發必須在api 10以上版本才支援,這點在開發中需要注意。另外,如上所述,在api 10以上系統版本開發p2p功能時,android系統提供了兩套api方法。在api 10+中提供的是foreground ndef push的api方法—enableforegroundndefpush(),在api 14+提供的是setndefpushmessagecallback()方法和setndefpushmessage()方法,這點在開發中也需要注意。
6.1.1 beam使用的條件
nfc p2p模式是指兩個nfc裝置在靠近彼此時完成資料的交換。在android api 14+後,将兩個android裝置之間通過p2p傳輸資料稱為beam,在兩個裝置之間要完成beam功能,必須具備以下幾個條件:
(1)必須打開手機的android beam功能,具體在android的設定中,如圖6-1所示;
(2)要實作beam ndef消息的應用程式(發送端)必須在前台,不能是背景服務,不能處在鎖屏狀态;
(3)要接收beam消息的手機(接收端),其螢幕不能處在鎖屏狀态;
(4)要在android手機裝置中完成beam功能,其手機系統版本必須是api 14+(api 10+也可以實作p2p功能,但一般習慣在api 14+後新提供的api實作的p2p功能稱為beam功能);
(5)兩個手機在進行彼此靠近實作beam功能時,會彈出圖6-2所示的畫面,顯示“touch to beam(觸摸發射)”,此時,使用者應該觸碰需要beam ndef消息的裝置,即發射裝置(另一裝置即為接收beam消息)。注意,該過程僅在api 14+以上系統才具備。

6.1.2 beam enable的判斷
在第4章中,本書介紹了android app開發中如何判斷系統上是否支援nfc功能以及nfc功能是否開啟。這裡需要特别注意,系統在支援nfc功能及nfc功能開啟的情況下并不能說明系統beam功能也是ok的,在api 14+後android系統中加入了isndefpushenabled( )方法,大家可以通過該函數判别beam功能是否enable,具體代碼如下:
第9行通過nfcadapter.getdefaultadapter(this)擷取nfc擴充卡,通過其判斷目前裝置是否支援nfc功能。
第18行通過mnfcadapter.isenabled()來判斷目前裝置nfc功能是否開啟。
第27行通過mnfcadapter.isndefpushenabled()來判斷目前裝置beam功能是否可用。
注意,在上述提到過,通過isndefpushenabled函數判斷beam功能是否enable。當傳回為ture時,nfc和beam功能都是enable的;當傳回為false時,此時beam功能是disable的,但隻要nfc功能是enable的,android裝置仍能接收beam消息隻是不能beam ndef消息。
更進一步地說,在兩個android nfc裝置靠近時,如果發送裝置上(bnm)目前打開的應用程式并沒有實作android beam功能,系統也會自動發送一條預設的ndef消息給接收端(rbm)。該ndef消息為發送端目前應用程式的uri,接收端接收到這條uri時,若系統版本是api 10~api 13,則系統會提示使用者該應用程式未打開;若系統版本是api 14+時,此時系統會自動跳轉到google paly中該app的下載下傳連結頁供使用者下載下傳。有了這個功能,使用者之間可以很輕易的實作app的分享。假設手機中有一個非常好玩的遊戲app,若要将此app分享給好友,隻要打開該遊戲然後觸碰一下好友的手機,該手機馬上會打開對應的app(當該app已經安裝的情形下)或者跳轉到google play中該app的下載下傳連結頁,很友善的實作分享。
另還有一點需要注意,如果在前台的activity中啟用了android beam,那麼标準的intent排程系統就會被禁用。但是,如果該activity還啟用了前台排程,那麼在前台排程系統中,它依然能夠掃描到跟intent過濾器比對的nfc标簽。