NFC的安卓事兒(提高篇)

2021-06-21 10:27:45 字數 4647 閱讀 4456

(nfc

基礎層次的精確過濾匹配)

當你的nfc

應用去掃瞄你配置好的標籤時,你肯定不希望別的

nfc應用也彈出

activity

來處理,還好,標籤排程系統在此進行了良好的設計。我們知道,

ndef

格式規範中,資料封裝在

ndefmessage

物件中,

ndefmessage

的第乙個

ndefrecord

資料塊一般用來決定其

mime

型別或相應

uri(當你往標籤打入資料時也是要這樣設計)。所以,當裝置感應到標籤時,標籤排程系統會先分析第乙個

ndefrecord

資料塊從而決定把

intent

分配給哪個應用處理。當然,如果資料的

mime

型別或uri

設計得不夠精確,那麼往往會造成匹配問題從而出現彈出多個

activity

供使用者選擇的情況。

如何去設計良好的mime

格式呢?在這裡,本人有必要先陳述下利用標籤排程系統本身能完成的一些功能:

ø 當你的裝置感應到標籤時你可以讓裝置自動呼叫預設瀏覽器開啟裡面的url

(一般就是乙個**)

ø 你也可以在感應後讓系統自動開啟某個裝置的應用程式(aar

技術,下文會講)

ø 你設計的過濾器和標籤資料的mime

型別或uri

完全匹配,那麼感應後優先開啟你的應用。(這就是精確匹配的問題了)

比如,你現在要往標籤寫入乙個**,你希望你的手機掃瞄後能自動開啟該**進入該**,那麼如何實現這個功能呢?在安卓官方文件裡,提供了一系列建立普通ndef

資料的方法。

比如可以建立乙個用tnf_absolute_uri

來解釋型別的記錄:

ndefrecord

urirecord =

newndefrecord(

ndefrecord

.tnf_absolute_uri,

"".getbytes(

charset

.forname(

"us-ascii"

)),

newbyte[0

],new

byte[0

]);

在此處,ndefrecord

的第乙個引數標明了如何解釋資料型別,第二個引數當做是乙個完整的

那麼,一旦掃瞄到該標籤那麼你的應用將作為精準匹配被優先開啟,這時,只是實現了開啟你應用讀取資料的過程。記住,無論什麼型別的記錄,資料一般是儲存在ndefrecord(short tnf, byte type, byte id, byte payload)

的最後乙個引數中。如果你的過濾配置中無相應的匹配,那麼掃瞄後系統將會試圖尋找其它匹配的

activity

,當無任何匹配時那麼就會呼叫瀏覽器開啟裡面的**了。

安卓的官方文件裡更推薦另一種寫入uri

的方法:

tnf_well_known

解釋的rtd_uri

記錄。這種方法更加高效(本人也沒搞明白為何比較高效),你可以按照如下方式建立:

利用createuri(string)

方法:

ndefrecord

rtdurirecord1 =

ndefrecord

.createuri(

"");

也可以手動建立:

ndefrecord

rtdurirecord =

newndefrecord(

ndefrecord

.tnf_well_known,

ndefrecord

.rtd_uri,

newbyte[0

],payload);

其中payload儲存你要設定的uri位址

顯然,如果你的應用想匹配該資料的標籤,那麼會有如下過濾配置:

以上便是利用uri

實現精確匹配的方法,如果你在中的

裡面沒做好相應的設定,都會造成你的應用無法實現相應過濾。比如寫成如下:

2"  //這裡把

寫成http2了

android:host

="example.com"

android:pathprefix=""

/>

那麼將無法實現精準匹配了。

那麼接下來我們來了解一下如何利用mime

型別實現精準匹配,

mime

型別使用

tnf_mime_media

來解釋具體的資料型別。

mime型別一般用來標識一些**資訊,比如文字資訊或是自己定義的格式,如以

text/plain

或為開頭。

你可以使用 createmime() 方法建立乙個ndefrecord

記錄:

ndefrecordmimerecord=

ndefrecord

.createmime( ,

"beam me up, android"

.getbytes(

charset

.forname(

"us-ascii"))

); 或者手動地建立:

ndefrecord

mimerecord =

newndefrecord(

ndefrecord

.tnf_mime_media ,

.getbytes(

charset

.forname(

"us-ascii"

)),

newbyte[0

], "beam me up, android!"

.getbytes(

charset

.forname(

"us-ascii"))

); android:name

="android.nfc.action.ndef_discovered"

/>

android:name

="android.intent.category.default"

/>

android:mimetype

=/>

一旦下的

配置錯誤,同樣會讓你的應用在掃瞄後無法完成相應精確過濾,這是要始終認識到的。

以文字作為示範,現在,你知道如何建立了麼?對,就是這樣:

ndefrecord ndefrecord = new ndefrecord(

ndefrecord.tnf_mime_media, 

"text/plain".getbytes(),

new byte {}, 

text.getbytes() );

相應的過濾配置如下:

android:name

="android.nfc.action.ndef_discovered"

/>

android:name

="android.intent.category.default"

/>

android:mimetype

="text/plain"

/>

但這有乙個問題,就是所有宣告為

android:mimetype

="text/plain"

/>

//表明會去處理

text/plian

型別的標籤

的過濾的應用都能實現匹配。所以,如果你真的希望你所部屬的標籤只被你應用過濾那麼就可以用之前那幾種方法選擇性的利用。

好了,關於過濾器匹配的問題就說到這裡了,靈活的建立不同型別的ndef

記錄是實現

activity

匹配和處理的乙個關鍵,希望能好好去掌握。下文我們將會去學習如何利用另一種匹配的技術:

aar。利用該技術我們可以在掃瞄標籤後開啟任何設定的應用程式,只不過

aar技術是和過濾匹配屬於不同的層次。我們將會對此進行了解,下文再見!

安卓廣播之理論篇

什麼叫廣播?比如 在 android 裡面有各種各樣的廣播,比如電池的使用狀態,的接收和簡訊的接收都會產生乙個廣播,應用程式開發者也可以監聽這些廣播並做出程式邏輯的處理 android廣播的分類 1 普通廣播 normal broadcasts 依次傳遞給各個處理器去處理 完全非同步的,可以在同一時...

安卓熱修篇 Shadow SDK實戰篇

同時也針對理論做了個實戰demo鞏固相關知識 安卓熱修篇 插樁式外掛程式化方案 demo篇 現在我們結合前面所學的知識,怎麼把熱修技術應用在sdk,投入生產 1 業務提需求,修改sdk,以支援業務功能 2 技術接到需求,進行開發 測試 發版本等 從上面的流程可以看出,當下模式有幾個短板 這裡是乙個虛...

安卓開發技巧篇 布局檢視神器

1.作為一名開發者,必須要掌握一些有用的開發技巧。而開發技巧,可以使我們快速完成工作任務,從而讓專案可以順利上線,比如 eclipse,studio 等快捷鍵,確實很方便,也大大提高了開發效率。3.使用sdk自動uiautomatorviewer工具檢視,就可以一目了然了。路徑為 sdk目錄下 to...