NFC 基礎(chǔ)
本文檔介紹了在Android上的基本的NFC任務(wù)淮阐。它說明了如何發(fā)送和接收的NDEF消息(NDEF messages)的形式的表單里包含的NFC數(shù)據(jù)(NFC data),并介紹Android框架里支持這些功能的API酗失。對(duì)于更高級(jí)的主題,包括與非NDEF數(shù)據(jù)的討論蜓谋,請(qǐng)參閱高級(jí)NFC吞瞪。
當(dāng)使用NDEF 數(shù)據(jù)和Android時(shí),有兩個(gè)主要的使用場景:
?從一個(gè)NFC 標(biāo)簽里讀取NDEF 數(shù)據(jù)
?使用 Android Beam? 快速傳輸Beaming NDEF messages從一臺(tái)設(shè)備到另一臺(tái)
<譯者注:Android Beam是android系統(tǒng)的一個(gè)傳輸套件养匈,對(duì)于具有NFC設(shè)備的手機(jī),可通過該功能在兩臺(tái)手機(jī)之間傳輸聯(lián)系人圖片等數(shù)據(jù)都伪,使用方法也很簡單呕乎,將兩個(gè)手機(jī)背靠背,這時(shí)候位于上面的手機(jī)會(huì)提示你“敲擊屏幕即可穿數(shù)據(jù)”>
從一個(gè)NFC tag里讀取NDEF data 將會(huì)經(jīng)過 tag dispatch system陨晶,分析被發(fā)現(xiàn)的NFC標(biāo)簽猬仁,進(jìn)行適當(dāng)?shù)臄?shù)據(jù)歸類,并啟動(dòng)一個(gè)對(duì)該分類的數(shù)據(jù)感興趣的應(yīng)用程序。那些想要處理被掃描到的NFC標(biāo)簽的應(yīng)用程序可以聲明一個(gè)意圖過濾器(declare an intent filter )湿刽,并要求處理這些數(shù)據(jù)的烁。
Android Beam?功能,它允許通過輕輕敲擊設(shè)備的方式诈闺,推送一個(gè)NDEF message從一臺(tái)設(shè)備到另一臺(tái)設(shè)備上撮躁。這種相互作用提供了一個(gè)簡單的方法來發(fā)送數(shù)據(jù),比其它無線技術(shù)买雾,比如藍(lán)牙把曼,因?yàn)橛辛薔FC,不再需要手動(dòng)設(shè)置發(fā)現(xiàn)或配對(duì)(譯者注:藍(lán)牙需要設(shè)置搜索設(shè)備和配對(duì))漓穿。當(dāng)兩個(gè)設(shè)備進(jìn)入范圍內(nèi)(譯者注:NFC要求在幾厘米內(nèi))签赃,自動(dòng)啟動(dòng)連接疙渣。 Android Beam可通過一組NFC API被使用条舔,因此梨水,任何應(yīng)用都可以在設(shè)備之間傳輸信息。例如僚饭,聯(lián)系人震叮,瀏覽器和YouTube應(yīng)用程序使用Android Beam與其他設(shè)備共享聯(lián)系人,網(wǎng)頁和視頻鳍鸵。
標(biāo)簽分發(fā)系統(tǒng) (The Tag Dispatch System)
Android的設(shè)備通常是在屏幕解鎖的時(shí)候?qū)ふ襈FC標(biāo)簽苇瓣,除非在設(shè)置菜單中禁用了NFC設(shè)備。當(dāng)Android手機(jī)發(fā)現(xiàn)了一個(gè)NFC標(biāo)簽偿乖,所希望的行為是最適當(dāng)?shù)腶ctivity來處理它击罪,而不是要求用戶選擇處理它的應(yīng)用程序。因?yàn)樵O(shè)備掃描NFC標(biāo)簽贪薪,在很短的范圍內(nèi)媳禁,它很可能導(dǎo)致當(dāng)用戶手動(dòng)選擇(處理該tag的應(yīng)用)時(shí)強(qiáng)行移動(dòng)設(shè)備遠(yuǎn)離標(biāo)簽而斷開連接。您最好讓你開發(fā)的應(yīng)用程序僅僅關(guān)注您制定的NFC標(biāo)簽画切,以防止用戶手動(dòng)選擇處理的活動(dòng)的頁面出現(xiàn)竣稽。
為了幫助你實(shí)現(xiàn)這個(gè)目標(biāo),Android提供了一個(gè)特殊的標(biāo)簽分發(fā)系統(tǒng)霍弹,它會(huì)分析被掃描到的NFC標(biāo)簽毫别,解析他們,并試圖定位到對(duì)這個(gè)被掃描到的標(biāo)簽感興趣的應(yīng)用程序庞萍。這是通過:
1拧烦。解析NFC標(biāo)簽和搞清楚MIME類型忘闻,或者被包含在標(biāo)簽中的有標(biāo)記的一個(gè)URI钝计。
2。先封裝MIME類型或URI,在裝入一個(gè)intent內(nèi)私恬。前兩個(gè)步驟中描述了NFC標(biāo)簽是如何映射到MIME類型和URI的债沮。
3。使用封裝好的intent啟動(dòng)應(yīng)用程序本鸣。這是描述如何將NFC標(biāo)簽分派到對(duì)其感興趣的應(yīng)用程序疫衩。
<譯者注:android 的標(biāo)簽分發(fā)系統(tǒng)做了下面一些事情:解析標(biāo)簽里的數(shù)據(jù),并裝入intent內(nèi)荣德,并啟動(dòng)關(guān)注該類型的標(biāo)簽的應(yīng)用程序>
NFC 標(biāo)簽是如何被映射到 MIME 類型和URIs 的
NFC標(biāo)簽是如何映射到MIME類型和URI
在你開始寫你的NFC應(yīng)用之前闷煤,重要的是要了解不同類型的NFC標(biāo)簽,標(biāo)簽分發(fā)系統(tǒng)如何解析NFC標(biāo)簽涮瞻,當(dāng)它(標(biāo)簽分發(fā)系統(tǒng))檢測(cè)到一個(gè)NDEF消息后如何分發(fā)到應(yīng)用程序鲤拿。NFC標(biāo)簽是一種比較廣泛的技術(shù)(譯者注:標(biāo)簽的種類樣式多),也有許多不同的數(shù)據(jù)寫入方式署咽。 Android最大化的支持NDEF標(biāo)準(zhǔn)近顷,它是由NFC論壇(NFC Forum.)定義的。
NDEF數(shù)據(jù)被封裝一個(gè)消息(NdefMessage)的內(nèi)部宁否,一個(gè)消息包含一個(gè)或多個(gè)的記錄(NdefRecord)窒升。每個(gè)NDEF記錄必須是格式有效的,符合規(guī)范的慕匠。當(dāng)然饱须,你的NDEF記錄也可以符合你創(chuàng)建的類型的規(guī)范。 Android還支持其他不包含NDEF數(shù)據(jù)的標(biāo)簽台谊,您可以通過使用包含在android.nfc.tech包的類來實(shí)現(xiàn)它冤寿。要了解有關(guān)這些技術(shù)的更多信息,請(qǐng)參見高級(jí)NFC主題青伤。工作涉及到編寫自己的協(xié)議棧與這些其他類型的標(biāo)簽進(jìn)行通信督怜,因此我們建議在可能易于開發(fā)的情況下使用NDEF和采用Android的設(shè)備的最大支持。
注意:要下載完整的NDEF規(guī)格狠角,請(qǐng)到NFC Forum Specification Download 頁面下載和查看 《創(chuàng)建一般類型的NDEF記錄Creating common types of NDEF records 》尋找如何建設(shè)NDEF記錄的示例号杠。
現(xiàn)在,你有NFC標(biāo)簽的一些背景知識(shí)丰歌,下面的章節(jié)更詳細(xì)描述了Android是如何處理NDEF格式的標(biāo)簽的姨蟋。當(dāng)Android手機(jī)掃描一個(gè)包含了NDEF格式數(shù)據(jù)的NFC標(biāo)簽,解析消息立帖,并試圖找出數(shù)據(jù)的MIME類型或標(biāo)識(shí)URI眼溶。要做到這一點(diǎn),系統(tǒng)讀取Ndef Message里面的第一個(gè)NdefRecord晓勇,以確定如何解釋整個(gè)NDEF消息(NDEF消息可以包含多個(gè)NDEF記錄)堂飞。在一個(gè)格式良好的NDEF消息中灌旧,第一個(gè)NdefRecord包含以下字段:
3-bit TNF (Type Name Format) - 類型名格式
指示如何解釋變量長度類型字段。有效的值記載在表1中描述的绰筛。
變量長度類型
描述記錄類型枢泰。如果使用TNF_WELL_KNOWN,使用此字段指定的記錄類型定義(RTD)铝噩。有效的RTD值描述于表2中衡蚂。
變量長度ID
記錄的唯一標(biāo)識(shí)符。此字段不經(jīng)常使用骏庸,但如果您需要一個(gè)具有唯一標(biāo)識(shí)的標(biāo)簽毛甲,你可以創(chuàng)建一個(gè)ID來這么做。
變量長度的有效載荷
要讀取或?qū)懭氲膶?shí)際數(shù)據(jù)負(fù)載具被。 一個(gè)NDEF消息可以包含多個(gè)NDEF記錄丽啡,所以不要以為全部負(fù)載存在于這個(gè)NDEF消息的第一條NDEF紀(jì)錄內(nèi)。
標(biāo)簽分發(fā)系統(tǒng)使用TNF和類型字段映射MIME類型或URI到一個(gè)NDEF消息硬猫。如果成功的話补箍,它封裝的信息位于一個(gè)ACTION_NDEF_DISCOVERED intent內(nèi)部,連同那些實(shí)際的有效載荷啸蜜。但是坑雅,也有標(biāo)記調(diào)度系統(tǒng)不能從第一條NDEF記錄里確定數(shù)據(jù)的類型情。發(fā)生這種情況時(shí)衬横,NDEF數(shù)據(jù)不能被映射到一個(gè)MIME類型或URI裹粤,或著當(dāng)NFC標(biāo)簽不以NDEF數(shù)據(jù)作為開始。在這種情況下蜂林,一個(gè)標(biāo)簽對(duì)象(Tag object)遥诉,該對(duì)象具有有關(guān)標(biāo)簽內(nèi)容的技術(shù)信息和有效載荷,將會(huì)被封裝到一個(gè)ACTION_TECH_DISCOVERED intent內(nèi)噪叙。
表1中矮锈。介紹了標(biāo)簽分發(fā)系統(tǒng)如何映射TNF和類型字段到MIME類型或URIs。同時(shí)也說明了哪些TNFs不能被映射到MIME類型或URI睁蕾。在這種情況下苞笨,標(biāo)簽分發(fā)系統(tǒng)將回退到ACTION_TECH_DISCOVERED的方式。
例如子眶,如果標(biāo)簽分發(fā)系統(tǒng)遇到一個(gè)TNF_ABSOLUTE_URI類型的紀(jì)錄瀑凝,將該記錄的變量長度類型字段映射到一個(gè)URI。標(biāo)簽分發(fā)系統(tǒng)封裝封裝那個(gè)URI到一個(gè) ACTION_NDEF_DISCOVERED intent的一個(gè)數(shù)據(jù)字段內(nèi)臭杰,以及與其他的標(biāo)簽信息粤咪,比如其他實(shí)際負(fù)載。另一方面渴杆,如果它遇到的記錄類型是TNF_UNKNOWN寥枝,它將創(chuàng)建標(biāo)簽的技術(shù)信息的封裝宪塔。
Table 1. 支持 TNFs and 對(duì)應(yīng)的映射
Type Name Format (TNF)
Mapping
TNF_ABSOLUTE_URI
基于類型字段的URI.
TNF_EMPTY
備選 ACTION_TECH_DISCOVERED.
TNF_EXTERNAL_TYPE
URI based on the URN in the type field. The URN is encoded into the NDEF type field in a shortened form: <domain_name>:<service_name>. Android maps this to a URI in the form:vnd.android.nfc://ext/<domain_name>:<service_name>.
TNF_MIME_MEDIA
基于類型字段的MIME 類型。
TNF_UNCHANGED
使得第一條記錄無效, 于是回退到 ACTION_TECH_DISCOVERED.
TNF_UNKNOWN
備選 ACTION_TECH_DISCOVERED.
TNF_WELL_KNOWN
MIME 類型 或者 URI 依賴于 記錄類型定義( Record Type Definition RTD), 這是您設(shè)置的類型字段. 參考 Table 2. 獲得更多的信息關(guān)于 有效的 RTDs 和 對(duì)應(yīng)的映射.
Table 2. 支持 RTDs 關(guān)于 TNF_WELL_KNOWN 和對(duì)應(yīng)的 映射
Record Type Definition (RTD)
Mapping
RTD_ALTERNATIVE_CARRIER
回退到 ACTION_TECH_DISCOVERED.
RTD_HANDOVER_CARRIER
回退到 ACTION_TECH_DISCOVERED.
RTD_HANDOVER_REQUEST
回退到 ACTION_TECH_DISCOVERED.
RTD_HANDOVER_SELECT
回退到 ACTION_TECH_DISCOVERED.
RTD_SMART_POSTER
需要對(duì)負(fù)載的內(nèi)容進(jìn)行解析的URI
RTD_TEXT
MIME 類型 的 text/plain.
RTD_URI
負(fù)載的內(nèi)容是URI
NFC標(biāo)簽是怎樣被分派到應(yīng)用程序的
當(dāng)標(biāo)簽分發(fā)系統(tǒng)創(chuàng)建了一個(gè)封裝了NFC標(biāo)簽和它的識(shí)別信息的 intent脉顿,標(biāo)簽分發(fā)系統(tǒng)會(huì)將該intent發(fā)送到添加了該intent 的過濾器(intent filter)的應(yīng)用程序。如果一個(gè)以上的應(yīng)用程序可以處理的該intent点寥,活動(dòng)選擇器將被啟動(dòng)艾疟,使得用戶可以選擇哪一個(gè)應(yīng)用程序。標(biāo)簽調(diào)度系統(tǒng)定義了三種intent敢辩,下面從最高優(yōu)先級(jí)到最低優(yōu)先級(jí)的順序展示它們:
ACTION_NDEF_DISCOVERED:當(dāng)一個(gè)標(biāo)簽被掃描蔽莱,包含有NDEF有效載荷或者是一個(gè)可識(shí)別的類型,將會(huì)創(chuàng)建一個(gè)這樣的intent 用來啟動(dòng)一個(gè)應(yīng)用程序戚长。這是最高優(yōu)先級(jí)的意圖盗冷,標(biāo)簽分發(fā)系統(tǒng)會(huì)盡可能的使用這種intent而不使用其他方式來啟動(dòng)一個(gè)應(yīng)用。<譯者注:盡可能直接對(duì)應(yīng)一個(gè)應(yīng)用而防止出現(xiàn)讓用戶選擇活動(dòng)>
ACTION_TECH_DISCOVERED:如果沒有活動(dòng)注冊(cè)處理ACTION_NDEF_DISCOVERED intent同廉,標(biāo)簽分發(fā)系統(tǒng)嘗試用這個(gè)意圖啟動(dòng)應(yīng)用程序仪糖。如果標(biāo)簽被掃描包含有NDEF數(shù)據(jù)但不能被映射到一個(gè)MIME類型或URI,或者如果標(biāo)簽不包含NDEF數(shù)據(jù)但同時(shí)是一個(gè)已知的標(biāo)簽技術(shù)迫肖,此intent也可直接被啟動(dòng)(沒有ACTION_NDEF_DISCOVERED優(yōu)先)锅劝。
ACTION_TAG_DISCOVERED:如果沒有活動(dòng)處理ACTION_NDEF_DISCOVERED 或者 ACTION_TECH_DISCOVERED的inent,那么這個(gè)inent將被啟動(dòng)。.
標(biāo)簽分發(fā)系統(tǒng)的工作原理蟆湖,基本方法如下:
標(biāo)簽分發(fā)系統(tǒng)解析NFC的標(biāo)簽故爵,創(chuàng)建inten,嘗試啟動(dòng)一個(gè)應(yīng)用程序(無論是ACTION_NDEF_DISCOVERED或ACTION_TECH_DISCOVERED)的。
如果沒有應(yīng)用的過濾器(intent filter)捕獲它隅津,嘗試使用下一個(gè)低優(yōu)先級(jí)的intent啟動(dòng)一個(gè)應(yīng)用程序(eitherACTION_TECH_DISCOVERED或ACTION_TAG_DISCOVERED)诬垂,直到被應(yīng)用程序的過濾器捕獲,或者直到標(biāo)簽分發(fā)度系統(tǒng)嘗試了所有可能的intent伦仍。
如果沒有應(yīng)用程序的intent過濾器(inent filter)捕獲該intent结窘,什么也不做.
<譯者注:android可以在系統(tǒng)配置文件指定某個(gè)activity的intent filter,標(biāo)簽分發(fā)系統(tǒng)會(huì)嘗試構(gòu)建intent來直接對(duì)應(yīng)它充蓝,如果失敗晦鞋,就再次嘗試更低級(jí)別的inent來嘗試,直到發(fā)現(xiàn)沒有任何一個(gè)來處理它>
圖 1. 標(biāo)簽分發(fā)系統(tǒng)
只要有可能棺克,請(qǐng)使用NDEF消息和ACTION_NDEF_DISCOVERED的inent來達(dá)成你的工作悠垛,因?yàn)樗侨Ninent里最特殊的一個(gè)。相比其他兩種intent娜谊,使用這個(gè)intent确买,您可以啟動(dòng)您的應(yīng)用程序在一個(gè)更合適的時(shí)間,從而給用戶帶來更好的體驗(yàn).
<譯者注:因?yàn)锳CTION_NDEF_DISCOVERED intent比較特殊纱皆,才更加的不容易發(fā)生用戶不得不手動(dòng)選擇處理該標(biāo)簽的程序的情況出現(xiàn)>
在Android清單文件(Manifest)里要求NFC訪問
在您訪問NFC硬件設(shè)備和妥善處理NFC的intent之前湾趾,在你的AndroidManifest.xml文件里聲明這些項(xiàng):
?NFC的硬件訪問權(quán)限<uses-permission>:
<uses-permission android:name="android.permission.NFC"/>
?您的應(yīng)用程序可以支持的最低SDK版本芭商。 API級(jí)別9只支持通過ACTION_TAG_DISCOVERED有限的標(biāo)簽分發(fā),只給訪問NDEF的消息使用EXTRA_NDEF_MESSAGES進(jìn)行額外的擴(kuò)展搀缠。沒有其他變量的屬性或I/ O操作可以訪問铛楣。 API 10級(jí)包括全面的讀/寫支持以及前臺(tái)NDEF推入, API 14級(jí)提供了一個(gè)簡單的使用Android Beam 對(duì)NDEF消息到其他設(shè)備的方式來推入和額外的方便的方法創(chuàng)建NDEF記錄艺普。
<uses-sdk android:minSdkVersion="10"/>
用戶特性 uses-feature 元素的聲明簸州,使得當(dāng)你的應(yīng)用程序Google Play 里出現(xiàn)時(shí),僅僅被具有NFC硬件的手機(jī)設(shè)備看到:
<uses-feature android:name="android.hardware.nfc" android:required="true" />
如果你的程序里的NFC功能不是必須得主要功能歧譬,那么可以忽略上面這個(gè)用戶特性 uses-feature 岸浑。你可以在程序運(yùn)行時(shí)檢測(cè)是否具有NFC硬件設(shè)備,使用getDefaultAdapter() 方法瑰步,如果為空矢洲,就是沒有NFC設(shè)備。.
NFC Intents的過濾器
一個(gè)你關(guān)注的NFC標(biāo)簽進(jìn)行被掃描盜時(shí)缩焦,您的應(yīng)用程序啟動(dòng)處理读虏,您的應(yīng)用程序可以在清單文件中聲明過濾一種,兩種或全部三種NFC intent袁滥。但是掘譬,當(dāng)應(yīng)用程序啟動(dòng)時(shí),您通常要篩選ACTION_NDEF_DISCOVERED意圖為了更多的控制呻拌。ACTION_TECH_DISCOVERED意圖是一個(gè)備用的方式葱轩,當(dāng)ACTION_NDEF_DISCOVERED時(shí)沒有被注冊(cè)到過濾器,或者有效載荷數(shù)據(jù)不是NDEF數(shù)據(jù)時(shí)藐握。過濾ACTION_TAG_DISCOVERED的intnet屬于過于籠統(tǒng)的過濾器類別靴拱。許多應(yīng)用程序會(huì)在ACTION_TAG_DISCOVERED之前,先過濾ACTION_NDEF_DISCOVERED或ACTION_TECH_DISCOVERED猾普,所以您的應(yīng)用程序啟動(dòng)的概率很低袜炕。ACTION_TAG_DISCOVERED僅可作為最后的手段,僅僅在沒有其他過濾了ACTION_NDEF_DISCOVERED或ACTION_TECH_DISCOVERED的意圖的應(yīng)用程序被安裝的情況下才有用初家。
因?yàn)镹FC標(biāo)簽的多樣化和多次性偎窘,往往不在你的控制之下,這并不總是可能的溜在,這就是為什么你在必要時(shí)需要備選其他兩種意圖陌知。當(dāng)你需要控制標(biāo)簽的類型和數(shù)據(jù)寫入,建議您使用NDEF格式的標(biāo)簽掖肋。以下各節(jié)描述了如何過濾每種類型的意圖.
ACTION_NDEF_DISCOVERED
為了過濾ACTION_NDEF_DISCOVERED intents, 聲明一個(gè)過濾器并且指定數(shù)據(jù)類型. 下面演示了如何過濾 ACTION_NDEF_DISCOVERED intents仆葡,它的MIME類型是text/plain:
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain" />
</intent-filter>
下面演示了URI格式的過濾,過濾格式為 http://developer.android.com/index.html.
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="http"
android:host="developer.android.com"
android:pathPrefix="/index.html" />
</intent-filter>
ACTION_TECH_DISCOVERED
如果你的程序想要過濾 ACTION_TECH_DISCOVERED intent, 你必須創(chuàng)建一個(gè)xml文件來描述你的程序支持的標(biāo)簽類型的規(guī)范志笼,這個(gè)規(guī)范文件里包含你支持的最小的技術(shù)列表tech-list. 這個(gè)列表支持的技術(shù)沿盅,將會(huì)和標(biāo)簽支持的技術(shù)進(jìn)行匹配把篓。在程序運(yùn)行時(shí),你可以獲得這些內(nèi)容腰涧,通過調(diào)用getTechList()方法韧掩。
比如,一個(gè)被掃描到的標(biāo)簽支持 MifareClassic, NdefFormatable, and NfcA, 你的程序里的支持列表里需要指明支持其中的三種窖铡,兩種疗锐,其中一種技術(shù)(或者可能都沒有) 為了使得你的程序被匹配到.
下面的示例定義了支持的所有的技術(shù). 你可以移除那些你不要的. 保存到 (可隨意命名) in the <project-root>/res/xml 文件夾.
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<tech-list>
<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>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>
你可以指定多個(gè) tech-list 集合. 每一個(gè) tech-list 被認(rèn)為是獨(dú)立的, 并且你的程序?qū)?huì)被匹配到一個(gè)單一的 tech-list , 它可以通過 getTechList()返回結(jié)果. 它為了技術(shù)匹配提供了 AND and OR 語義. 下面演示了一個(gè)標(biāo)簽匹配支持NfcA and Ndef 技術(shù) 或者 可被支持 NfcB and Ndef 技術(shù):
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<tech-list>
<tech>android.nfc.tech.NfcA</tech>
<tech>android.nfc.tech.Ndef</tech>
</tech-list>
</resources>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<tech-list>
<tech>android.nfc.tech.NfcB</tech>
<tech>android.nfc.tech.Ndef</tech>
</tech-list>
</resources>
在你的 AndroidManifest.xml 文件, 指定你剛剛創(chuàng)建的資源文件的位置万伤。 在<activity> 節(jié)點(diǎn)的 <meta-data> 節(jié)點(diǎn)下 窒悔,下面是演示:
<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" />
...
</activity>
想獲得更多標(biāo)簽的技術(shù)支持信息和 關(guān)于 ACTION_TECH_DISCOVERED intent,查閱Working with Supported Tag Technologies 在NFC高級(jí)篇.
ACTION_TAG_DISCOVERED
為了過濾 ACTION_TAG_DISCOVERED 使用下面的方式:
<intent-filter>
<action android:name="android.nfc.action.TAG_DISCOVERED"/>
</intent-filter>
從 intents 中讀取信息
如果NFC intent啟動(dòng)一個(gè)應(yīng)用, 你可以從這個(gè) intent中獲得更多信息. 該Intents可以從標(biāo)簽里讀到到下列擴(kuò)展信息:
EXTRA_TAG (必選): 一個(gè)代表里讀取到的標(biāo)簽的 Tag 對(duì)象.
EXTRA_NDEF_MESSAGES (可選): 從標(biāo)簽的 NDEF messages 中讀取到的一個(gè)數(shù)據(jù)集合. 這個(gè)信息是強(qiáng)制的呜袁。
{@link android.nfc.NfcAdapter#EXTRA_ID (可選): 標(biāo)簽的低級(jí)別的ID.
要獲得這些擴(kuò)展信息敌买,請(qǐng)檢查如果您的程序是否被NFC intent啟動(dòng),并確保一個(gè)標(biāo)簽被掃描阶界,這時(shí)就可以從intent中讀取擴(kuò)展信息了虹钮。下面的示例檢查了一個(gè)ACTION_NDEF_DISCOVERED的intent,并嘗試從包含NDEF消息的intent中讀取擴(kuò)展信息膘融。.
public void onResume() {
super.onResume();
...
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
if (rawMsgs != null) {
msgs = new NdefMessage[rawMsgs.length];
for (int i = 0; i < rawMsgs.length; i++) {
msgs[i] = (NdefMessage) rawMsgs[i];
}
}
}
//process the msgs array
}
另外芙粱,你也可以從intent得到一個(gè)tag對(duì)象,它將包含有效載荷數(shù)據(jù)氧映,并允許您列舉標(biāo)簽的技術(shù):
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
創(chuàng)建常見類型的NDEF紀(jì)錄
本節(jié)介紹如何創(chuàng)建一個(gè)通用類型的NDEF記錄春畔,有助于你寫入到NFC標(biāo)簽,或發(fā)送數(shù)據(jù)與Android Beam岛都。開始采用Android4.0(API級(jí)別14)中律姨,createUri()方法可以幫助你自動(dòng)創(chuàng)建URI類型的記錄。在Android4.1(API16級(jí))臼疫,createExternal()和createMime()是可幫助您創(chuàng)建MIME類型和外部擴(kuò)展類型NDEF記錄择份。使用這些輔助方法使得在手動(dòng)創(chuàng)建NDEF記錄時(shí)盡可能避免錯(cuò)誤荣赶。
本節(jié)還介紹了如何創(chuàng)建相應(yīng)的intent filter的記錄鸽斟。下面這些NDEF記錄示例必須在你的NDEF消息里的第一條NDEF記錄內(nèi)拔创,在你寫入標(biāo)簽或者Android Beam時(shí).
TNF_ABSOLUTE_URI
注意: 我們推薦你使用 RTD_URI 類型來代替 TNF_ABSOLUTE_URI, 因?yàn)樗矢?
你可以創(chuàng)建一個(gè) TNF_ABSOLUTE_URI NDEF 記錄富蓄,按照下面的方式:
NdefRecord uriRecord = new NdefRecord(
NdefRecord.TNF_ABSOLUTE_URI ,
"http://developer.android.com/index.html".getBytes(Charset.forName("US-ASCII")),
new byte[0], new byte[0]);
過濾上面這個(gè)NDEF記錄的intent filter這么寫:
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http"
android:host="developer.android.com"
android:pathPrefix="/index.html" />
</intent-filter>
TNF_MIME_MEDIA
你可以創(chuàng)建一個(gè) TNF_MIME_MEDIA NDEF 記錄, 按下面的方式.
使用 createMime() 方法:
NdefRecord mimeRecord = NdefRecord.createMime("application/vnd.com.example.android.beam",
"Beam me up, Android".getBytes(Charset.forName("US-ASCII")));
手動(dòng)方式創(chuàng)建 NdefRecord :
NdefRecord mimeRecord = new NdefRecord(
NdefRecord.TNF_MIME_MEDIA ,
"application/vnd.com.example.android.beam".getBytes(Charset.forName("US-ASCII")),
new byte[0], "Beam me up, Android!".getBytes(Charset.forName("US-ASCII")));
過濾上面這個(gè)NDEF記錄的intent filter這么寫:
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="application/vnd.com.example.android.beam" />
</intent-filter>
TNF_WELL_KNOWN with RTD_TEXT
你可以創(chuàng)建一個(gè) TNF_WELL_KNOWN NDEF 記錄格粪,按照下面的方式:
public NdefRecord createTextRecord(String payload, Locale locale, boolean encodeInUtf8) {
byte[] langBytes = locale.getLanguage().getBytes(Charset.forName("US-ASCII"));
Charset utfEncoding = encodeInUtf8 ? Charset.forName("UTF-8") : Charset.forName("UTF-16");
byte[] textBytes = payload.getBytes(utfEncoding);
int utfBit = encodeInUtf8 ? 0 : (1 << 7);
char status = (char) (utfBit + langBytes.length);
byte[] data = new byte[1 + langBytes.length + textBytes.length];
data[0] = (byte) status;
System.arraycopy(langBytes, 0, data, 1, langBytes.length);
System.arraycopy(textBytes, 0, data, 1 + langBytes.length, textBytes.length);
NdefRecord record = new NdefRecord(NdefRecord.TNF_WELL_KNOWN,
NdefRecord.RTD_TEXT, new byte[0], data);
return record;
}
過濾上面這個(gè)NDEF記錄的intent filter這么寫:
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
TNF_WELL_KNOWN with RTD_URI
你可以創(chuàng)建一個(gè) TNF_WELL_KNOWN NDEF 記錄氛改,按照下面的方式:
使用 createUri(String) 方法:
NdefRecord rtdUriRecord1 = NdefRecord.createUri("http://example.com");
使用 createUri(Uri) 方法:
Uri uri = new Uri("http://example.com");
NdefRecord rtdUriRecord2 = NdefRecord.createUri(uri);
手動(dòng)創(chuàng)建 NdefRecord :
byte[] uriField = "example.com".getBytes(Charset.forName("US-ASCII"));
byte[] payload = new byte[uriField.length + 1]; //add 1 for the URI Prefix
byte payload[0] = 0x01; //prefixes http://www. to the URI
System.arraycopy(uriField, 0, payload, 1, uriField.length); //appends URI to payload
NdefRecord rtdUriRecord = new NdefRecord(
NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_URI, new byte[0], payload);
過濾上面這個(gè)NDEF記錄的intent filter這么寫:
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http"
android:host="example.com"
android:pathPrefix="" />
</intent-filter>
TNF_EXTERNAL_TYPE
你可以創(chuàng)建一個(gè) TNF_EXTERNAL_TYPE NDEF 記錄胜卤,按照下面的方式:
使用 createExternal() 方法:
byte[] payload; //assign to your data
String domain = "com.example"; //usually your app's package name
String type = "externalType";
NdefRecord extRecord = NdefRecord.createExternal(domain, type, payload);
手動(dòng)創(chuàng)建 NdefRecord :
byte[] payload;
...
NdefRecord extRecord = new NdefRecord(
NdefRecord.TNF_EXTERNAL_TYPE, "com.example:externalType", new byte[0], payload);
The intent filter for the previous NDEF records would look like this:
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="vnd.android.nfc"
android:host="ext"
android:pathPrefix="/com.example:externalType"/>
</intent-filter>
使用 TNF_EXTERNAL_TYPE 類型是一個(gè)更普遍的標(biāo)簽葛躏,可以更好的支持android和非android設(shè)備.
注意: 關(guān)于TNF_EXTERNAL_TYPE 的URNs 有典型格式:urn:nfc:ext:example.com:externalType, 然而 NFC Forum RTD 規(guī)范聲明: urn:nfc:ext: 部分必須從NDEF記錄里被省略. 那么悠菜,所有你需要提供的內(nèi)容是一個(gè)域 (比如example.com ) 和類型(比如externalType)悔醋,并用冒號(hào)分割它們. 當(dāng)標(biāo)簽分發(fā)系統(tǒng)分發(fā)一個(gè)TNF_EXTERNAL_TYPE的標(biāo)簽時(shí)芬骄, Android 轉(zhuǎn)換urn:nfc:ext:example.com:externalType 格式的URN 成vnd.android.nfc://ext/example.com:externalType 格式的URI, 它就是上面的intent過濾器里聲明的演示的樣子.
Android 應(yīng)用程序記錄 (AAR)
Android在Android4.0(API等級(jí)14)推出一個(gè)Android應(yīng)用程序記錄(AAR),AAR提供了更強(qiáng)的確定性蒂秘,在您的應(yīng)用程序因?yàn)橐粋€(gè)NFC標(biāo)簽被掃描時(shí)而啟動(dòng)時(shí)姻僧。 AAR具有嵌入在NDEF記錄內(nèi)的應(yīng)用程序的包名蒲牧。您可以添加一個(gè)AAR到您的任何NDEF記錄NDEF消息內(nèi)造成,因?yàn)锳ndroid搜索整個(gè)NDEF消息內(nèi)的所有AAR。如果它發(fā)現(xiàn)AAR喘蟆,根據(jù)里面的AAR的包名稱來啟動(dòng)應(yīng)用程序蕴轨。如果設(shè)備上不存在該應(yīng)用程序骇吭,谷歌PLAY(譯者注:應(yīng)用程序市場)將被啟動(dòng)并導(dǎo)向去下載該應(yīng)用程序。.
如果你要防止其他應(yīng)用程序過濾功能可能相同的意圖和潛在的處理您已經(jīng)部署的特定標(biāo)簽斜筐,AARs是有用的顷链。因?yàn)榘鸄ARS只支持在應(yīng)用程序級(jí)別過濾屈梁,而不是在通過使用intetnt過濾器的Activity級(jí)別在讶。如果你想處理一個(gè)Activity的intent构哺,請(qǐng)使用intent filter。
如果一個(gè)標(biāo)簽包含一個(gè)AAR蝗碎,標(biāo)簽分發(fā)系統(tǒng)將會(huì)以下方式工作:.
嘗試按常規(guī)的方式使用intent filter過濾器來啟動(dòng)一個(gè)activity. 如果該應(yīng)用匹配了過濾器的規(guī)則,同時(shí)又匹配了AAR的規(guī)則臀防,那么啟動(dòng)該activity.
如果匹配了過濾器的規(guī)則边败,但是未匹配AAR規(guī)則笑窜;如果一個(gè)intent引發(fā)多個(gè)activity的啟動(dòng)(譯者注:會(huì)彈出提示用戶手動(dòng)選擇)排截;或者沒有任何一個(gè)activity過濾到一個(gè)intent;那么將按照AAR程序規(guī)范執(zhí)行.
如果沒有應(yīng)用程序可以被AAR啟動(dòng)脱吱,那么將被引導(dǎo)到Google Play 以下載AAR指向的應(yīng)用程序箱蝠。
注意: 你可以使用 前端分發(fā)系統(tǒng)( foreground dispatch system)來覆蓋AARs和標(biāo)簽分發(fā)系統(tǒng)的處理方式, 它允許一個(gè)前端正在運(yùn)行的頂層活動(dòng)的activity 擁有更高的優(yōu)先權(quán)來處理發(fā)現(xiàn)到的標(biāo)簽. 使用這種方法時(shí)宦搬,必須要在前端頂層主動(dòng)的覆蓋AARs和標(biāo)簽分發(fā)系統(tǒng)的行為.
如果你仍然想過濾那些不包含AAR的標(biāo)簽间校,你可以按常規(guī)形式聲明一個(gè)intent filter. 在你的應(yīng)用程序?qū)ζ渌话珹AR的標(biāo)簽有興趣時(shí),這將很有用. 比如聂渊, 或許你想保證你的程序 處理 你不熟的私有標(biāo)簽 as well as 第三方部署的常規(guī)標(biāo)簽. 保持關(guān)注 Android 4.0 及以后的設(shè)備規(guī)范, 這樣當(dāng)部署時(shí), 你非澈核裕可能想去使用一個(gè)組合AARs 和 MIME 類型的/URIs 為了支持更寬廣范圍的設(shè)備. 另外饼暑,當(dāng)你部署 NFC 標(biāo)簽, 考慮一下如果寫入你的NFC標(biāo)簽舍得可以支持更多的設(shè)備(Android設(shè)備和其他設(shè)備). 你可以這樣做弓叛,像定義相對(duì)唯一的 MIME 類型 或URI 的方式來使得更容易區(qū)分.
Android 提供了一個(gè)簡單的 API去創(chuàng)建一個(gè)AAR, createApplicationRecord(). 你所做的就是在任何位置嵌入一個(gè)AAR 到你的Ndef消息內(nèi). 你不需要使用你的ndef消息的第一條記錄, 除非你僅僅只有一條記錄. 這是因?yàn)?Android 系統(tǒng) 檢測(cè) Ndef消息的第一條記錄來決定 MIME 類型 或者 標(biāo)簽的URI, 它常常用于為應(yīng)用程序過濾intent時(shí)創(chuàng)建一個(gè)intent. 下面的代碼演示了如果創(chuàng)建AAR:
NdefMessage msg = new NdefMessage(
new NdefRecord[] {
...,
NdefRecord.createApplicationRecord("com.example.android.beam")}
Beaming NDEF消息到其他設(shè)備
Android Beam可以支持兩款A(yù)ndroid設(shè)備之間的簡單的點(diǎn)到點(diǎn)數(shù)據(jù)交換撰筷。想要進(jìn)行Android Beam數(shù)據(jù)到另一臺(tái)設(shè)備中的那臺(tái)的設(shè)備的應(yīng)用程序必須是在前臺(tái)程序(譯者注:活動(dòng)的)畦徘,而且接收該數(shù)據(jù)的設(shè)備不能被鎖定井辆。當(dāng)準(zhǔn)備進(jìn)行Android Beam的設(shè)備有足夠接近的接觸到準(zhǔn)備接收的設(shè)備時(shí)杯缺,Android Beam設(shè)備顯示“點(diǎn)擊屏幕開始Beam”的窗體萍肆。然后,用戶可以選擇是否Beam消息到接收設(shè)備內(nèi)蜡塌。.
注意: 前端 NDEF 推送 在API level 10后 是可用的, 它提供了和 Android Beam.類似的功能馏艾。那些 APIs 目前已經(jīng)被棄用, 但是在舊的設(shè)備仍然是可用的. 閱讀 enableForegroundNdefPush() 可以獲得更多信息.
你可以在你的程序里啟用 Android Beam 琅摩,使用下面兩個(gè)方法中的任何一個(gè):
setNdefPushMessage(): 接受一個(gè) NdefMessage,作為準(zhǔn)備進(jìn)行beam的消息. 當(dāng)兩個(gè)設(shè)備非常接近時(shí)蜕劝,自動(dòng)的進(jìn)行beams 消息 .
setNdefPushMessageCallback(): 接受一個(gè)回調(diào)方法岖沛,該回調(diào)包含了一個(gè) createNdefMessage()方法婴削, 該回調(diào)在一個(gè)設(shè)備在可以beam 的時(shí)候被調(diào)用. 這個(gè)回調(diào)方法允許你僅僅在需要的時(shí)候創(chuàng)建Ndef消息.
一個(gè)Activity 一次只能推送一個(gè)NDEF消息唉俗,所以如果兩者都設(shè)置了配椭,setNdefPushMessageCallback()的優(yōu)先級(jí)超過setNdefPushMessage()股缸。使用Android Beam乓序,必須滿足以下一般原則:
進(jìn)行beaming數(shù)據(jù)的 activity 必須在前端. 兩個(gè)設(shè)備的屏幕都不能被鎖定.
你必須封裝你準(zhǔn)備 beaming的數(shù)據(jù)到一個(gè) NdefMessage 消息對(duì)象.
在NFC的裝置替劈,接收的無線傳輸數(shù)據(jù)必須支持com.android.npp的NDEF的推送協(xié)議或NFC論壇的SNEP(簡單的NDEF交換協(xié)議)得滤。該com.android.npp協(xié)議需要API 9級(jí)的Android 2.3設(shè)備懂更,直到 API 13級(jí)Android 3.2的設(shè)備沮协。 com.android.npp和SNEP都是必需的API14級(jí)(安卓4.0)和更高版本慷暂。
注意: 如果你的activity 啟用了 Android Beam 并且當(dāng)前處于前端活動(dòng)的, 標(biāo)準(zhǔn)的標(biāo)簽分發(fā)系統(tǒng)將不可使用. 然而, 如果你的activity 仍然啟用的前端分發(fā)系統(tǒng)(foreground dispatching), 這是它仍然能匹配標(biāo)簽,在你i的標(biāo)簽分發(fā)系統(tǒng)里匹配intent filters設(shè)置.
啟用 Android Beam 的方法:
創(chuàng)建一個(gè) NdefMessage餐禁,這個(gè)消息里包含了你準(zhǔn)備推送到其他設(shè)備的 NdefRecord .
在你的activity的onCreate()方法中突照,調(diào)用 setNdefPushMessage() 傳入?yún)?shù)是一個(gè) NdefMessage 或 者調(diào)用 setNdefPushMessageCallback 傳入一個(gè) NfcAdapter.CreateNdefMessageCallback 對(duì)象. 這些方法都至少需要一個(gè)你要啟用Android Beam的activity讹蘑,連同其他激活的activity的可選列表座慰。
在一般情況下角骤,當(dāng)兩個(gè)設(shè)備都在溝通的范圍,如果僅僅推送相同的NDEF消息背桐,您通常使用setNdefPushMessage()链峭。當(dāng)您的應(yīng)用程序關(guān)心當(dāng)前應(yīng)用程序的上下文信息(目前情況)弊仪,或者希望根據(jù)用戶在做什么來推動(dòng)一個(gè)NDEF消息励饵,您可以使用 setNdefPushMessageCallback滑燃。
下面的示例顯示了如何在一個(gè)簡單的activity的onCreate()方法中調(diào)用NfcAdapter.CreateNdefMessageCallback(完整的示例見AndroidBeamDemo)表窘。這個(gè)例子也可以幫助您創(chuàng)建一個(gè)MIME記錄:
package com.example.android.beam;
import android.app.Activity;
import android.content.Intent;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.NfcAdapter.CreateNdefMessageCallback;
import android.nfc.NfcEvent;
import android.os.Bundle;
import android.os.Parcelable;
import android.widget.TextView;
import android.widget.Toast;
import java.nio.charset.Charset;
public class Beam extends Activity implements CreateNdefMessageCallback {
NfcAdapter mNfcAdapter;
TextView textView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView textView = (TextView) findViewById(R.id.textView);
// Check for available NFC Adapter
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
if (mNfcAdapter == null) {
Toast.makeText(this, "NFC is not available", Toast.LENGTH_LONG).show();
finish();
return;
}
// Register callback
mNfcAdapter.setNdefPushMessageCallback(this, this);
}
@Override
public NdefMessage createNdefMessage(NfcEvent event) {
String text = ("Beam me up, Android!\n\n" +
"Beam Time: " + System.currentTimeMillis());
NdefMessage msg = new NdefMessage(
new NdefRecord[] { createMime(
"application/vnd.com.example.android.beam", text.getBytes())
/**
* The Android Application Record (AAR) is commented out. When a device
* receives a push with an AAR in it, the application specified in the AAR
* is guaranteed to run. The AAR overrides the tag dispatch system.
* You can add it back in to guarantee that this
* activity starts when receiving a beamed message. For now, this code
* uses the tag dispatch system.
*/
//,NdefRecord.createApplicationRecord("com.example.android.beam")
});
return msg;
}
@Override
public void onResume() {
super.onResume();
// Check to see that the Activity started due to an Android Beam
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
processIntent(getIntent());
}
}
@Override
public void onNewIntent(Intent intent) {
// onResume gets called after this to handle the intent
setIntent(intent);
}
/**
* Parses the NDEF Message from the intent and prints to the TextView
*/
void processIntent(Intent intent) {
textView = (TextView) findViewById(R.id.textView);
Parcelable[] rawMsgs = intent.getParcelableArrayExtra(
NfcAdapter.EXTRA_NDEF_MESSAGES);
// only one message sent during the beam
NdefMessage msg = (NdefMessage) rawMsgs[0];
// record 0 contains the MIME type, record 1 is the AAR, if present
textView.setText(new String(msg.getRecords()[0].getPayload()));
}
}
注意,這段代碼注釋掉AAR捂敌,您也可以刪除它黍匾。如果您啟用了AAR,在AAR指定的應(yīng)用程序總是能接收Android Beam消息磕诊。如果應(yīng)用程序是不存在的霎终,Google Play會(huì)啟動(dòng)下載該應(yīng)用程序莱褒。因此广凸,Android4.0或更高版本的設(shè)備下蛛枚,如果使用的AAR蹦浦,下面的意圖過濾器不是技術(shù)上必須的:
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="application/vnd.com.example.android.beam"/>
</intent-filter>
有了這個(gè)意圖過濾器盲镶,現(xiàn)在當(dāng)它掃描一個(gè)NFC標(biāo)簽溉贿,或接收到一個(gè)AAR的類型com.example.android.beam的android beam消息時(shí),或當(dāng)收到一個(gè)包含了 MIME 記錄application/vnd.com.example.android.beam.記錄的NDEF格式的消息由蘑,現(xiàn)在的com.example.android.beam應(yīng)用程序?qū)⒖梢员粏?dòng)爷狈。。
即使AARS保證了應(yīng)用程序被啟動(dòng)或下載思币,仍然建議使用意圖過濾器谷饿。因?yàn)樗梢宰屇銌?dòng)您選擇的應(yīng)用程序中的Activity博投,而不是總是啟動(dòng)一個(gè)AAR指定的包內(nèi)的主Activity毅哗。AARs沒有Activity級(jí)別水平的粒度虑绵。同時(shí)翅睛,由于一些Android系統(tǒng)的設(shè)備不支持AARS,以防萬一酥艳,你也應(yīng)該嵌入的標(biāo)識(shí)信息在你的NDEF消息的第一條記錄里充石,并且使用過濾器過濾它骤铃。關(guān)于如何創(chuàng)建記錄的更多信息惰爬,請(qǐng)參閱Creating Common Types of NDEF records 撕瞧。
本文翻譯自谷歌的文檔丛版,轉(zhuǎn)載請(qǐng)注明出處偏序。原文地址:
http://developer.android.com/intl/zh-CN/guide/topics/connectivity/nfc/nfc.html
本人借助google 翻譯研儒,有道詞典進(jìn)行的翻譯,感謝這些方便的工具提供者們燃箭。
同時(shí)感謝cnblogs提供的博客功能招狸。
本文的預(yù)期讀者是具有一些android開發(fā)基礎(chǔ)的開發(fā)人員瓢颅,在了解開發(fā)的知識(shí)下挽懦,應(yīng)該能讀懂文章的內(nèi)容信柿。
本人能力有限渔嚷,翻譯會(huì)有疏漏和錯(cuò)誤形病,還請(qǐng)讀者諒解霞幅。
翻譯這些內(nèi)容來源于項(xiàng)目的需要司恳,曾經(jīng)接到需要讀取RFID標(biāo)簽的一個(gè)需求扔傅。后來到處在網(wǎng)上搜說一些文章猎塞,直到發(fā)現(xiàn)這 android文檔提供的詳盡內(nèi)容邢享,決定用一些時(shí)間來翻譯它骇塘,這樣自己閱讀也方便款违,同時(shí)也方便那些尋找資料的開發(fā)人員插爹。
正文如下: