本文檔介紹了Android中執行基本任務NFC。它說明了如何在NDEF消息的形式發送和接收數據的NFC並介紹了支持這些功能的Andr??oid框架的API。對於更高級的主題,包括與非NDEF數據工作的討論,請參閱高級NFC。
沒有與NDEF數據和Android時兩個主要用例:
從NFC標簽讀取NDEF數據
從一台設備喜氣洋洋NDEF消息到另一個通過Android Beam?
從NFC標簽讀取NDEF數據與標簽調度系統,其中分析發現NFC標簽處理,適當地進行分類的數據,並啟動一個應用程序,是感興趣的分類數據。想要來處理掃描NFC標簽的應用程序可以聲明意圖過濾器,並要求來處理數據。
而Android梁?功能允許設備通過物理竊聽設備一起推的NDEF消息到另一個設備。這種互動提供了發送比其它無線技術,如藍牙數據更簡單的方法,因為NFC,無需手動裝置發現或配對。當兩個設備進入通信范圍內的連接會自動啟動。 Android Beam功能可通過一組NFC的API,所以任何應用都可以傳輸設備之間的信息。例如,聯系人,浏覽器和YouTube應用程序使用Android Beam的共享聯系人,網頁,並與其他設備的視頻。
標簽調度系統
Android設備通常是尋找NFC標簽的時候,屏幕解鎖,除非NFC在設備的設置菜單禁用。當一個Android設備發現一個NFC標簽,期望的行為是有最合適的處理活動的意圖不問使用什麼應用程序的用戶。由於設備在很短的范圍掃描NFC標簽,很可能使用戶手動選擇的活動將迫使他們移動設備從標簽路程,斷開連接。你應該開發自己的活動,只處理了您的活動在乎防止活動選配出現的NFC標簽。
為了幫助您完成這個目標,Android提供了一個特殊的標簽調度系統,可以分析掃描NFC標簽,解析它們,並試圖找到感興趣的掃描數據的應用程序。它通過:
解析NFC標簽和搞清楚MIME類型或一個URI標識代碼中的數據有效載荷。
封裝MIME類型或URI和有效載荷送入意圖。前兩個步驟怎麼NFC標簽被映射到MIME類型和URI描述。
開始基於所述意圖的活性。這是在如??何NFC標簽被分派到應用程序描述。
如何NFC標簽被映射到MIME類型和URI
你開始寫你的NFC應用之前,必須了解不同類型的NFC標簽是很重要的,標簽調度系統如何解析NFC標簽和特殊的工作,當它檢測到NDEF消息的標記調度系統一樣。 NFC標簽來在廣泛的技術和還可以有許多不同的方式寫入到其中的數據。機器人具有用於NDEF標准,它是由NFC論壇所定義的最支持。
NDEF數據被封裝的消息(NdefMessage),其中包含一個或多個記錄(NdefRecord)的內部。每個NDEF記錄必須根據您要創建的記錄類型的規格良好的。 Android版還支持其它類型的標簽不包含NDEF的數據,你可以通過在android.nfc.tech包中的類工作。要了解更多有關這些技術,請參見高級NFC主題。這些其他類型的標簽工作包括編寫你自己的協議棧與標簽進行通信,因此,我們建議使用NDEF在可能的情況,便於開發和最大支持Android的供電設備。
注意:要下載完整NDEF的規格,去NFC論壇規范下載網站,看看如何構建NDEF記錄的例子創建常見類型的NDEF記錄。
現在,你有NFC標簽的背景,下面的章節詳細描述了Android的如何處理NDEF格式化的標簽。當一個Android設備掃描包含NDEF格式的數據的NFC標簽,它解析該消息並試圖找出數據的MIME類型或標識的URI。要做到這一點,系統讀取NdefMessage內的第一NdefRecord以確定如何解釋整個NDEF消息(一個NDEF消息可以有多個NDEF記錄)。在一個結構良好的NDEF消息,第一NdefRecord包含以下字段:
3位腫瘤壞死因子(類型名稱格式)
指示如何解釋可變長度類型字段。有效值在表1中描述了描述。
可變長度類型
描述了記錄的類型。如果使用TNF_WELL_KNOWN,使用此字段指定記錄類型定義(RTD)。有效RTD值在表2中描述。
可變長度ID
的唯一標識備案。此字段不經常使用,但如果您需要唯一標識標簽,你可以為它創建一個ID。
可變長度的有效載荷
要讀取或寫入的實際數據的有效載荷。一個NDEF消息可以包含多個NDEF記錄,所以不承擔全部有效載荷在NDEF消息的第一NDEF紀錄。
標簽調度系統使用腫瘤壞死因子和類型字段來嘗試映射MIME類型或URI的NDEF消息。如果成功,它封裝與實際載荷沿ACTION_NDEF_DISCOVERED意圖的內部信息。不過,也有當標簽調度系統不能確定數據的基礎上,第一個NDEF記錄中的類型的情況。這種情況發生在NDEF數據不能被映射到一個MIME類型或URI,或當NFC標簽不包含NDEF數據開始。在這種情況下,具有關於標簽的技術和有效載荷信息,標簽對象封裝一個ACTION_TECH_DISCOVERED意圖,而不是內部。
表1描述了標簽調度系統如何TNF和類型字段映射到MIME類型或URI的。它也描述了TNFs不能被映射到一個MIME類型或URI。在這些情況下,標簽調度系統回落到ACTION_TECH_DISCOVERED。
例如,如果標簽調度系統遇到類型TNF_ABSOLUTE_URI的記錄,它映射該記錄到URI的可變長度類型字段。標簽調度系統封裝該URI在ACTION_NDEF_DISCOVERED意圖的數據字段有關的標簽的其他信息,例如有效載荷沿。在另一方面,如果遇到類型TNF_UNKNOWN的記錄,它會創建一個封裝標簽的技術,而不是意圖。
表1.支持TNFs及其映射
類型名稱格式(TNF)映射
基於該類型字段TNF_ABSOLUTE_URI URI。
TNF_EMPTY回落到ACTION_TECH_DISCOVERED。
基於類型字段甕TNF_EXTERNAL_TYPE URI。骨灰盒被編碼到NDEF類型字段的縮寫形式:<域名>:<服務>。 Android在形式映射給URI:vnd.android.nfc:// EXT / <域名>:<服務>。
基於該類型字段TNF_MIME_MEDIA MIME類型。
第一條記錄TNF_UNCHANGED無效的,所以回落到ACTION_TECH_DISCOVERED。
TNF_UNKNOWN回落到ACTION_TECH_DISCOVERED。
TNF_WELL_KNOWN MIME類型或URI取決於記錄類型定義(RTD),您在類型字段設置。見表2.可用的RTD及其映射的更多信息。
為TNF_WELL_KNOWN及其映射表2.受支持的RTD
記錄類型定義(RTD)映射
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 URI。
RTD_TEXT MIME類型的文本/平原。
基於有效載荷RTD_URI URI。
如何NFC標簽被分派到應用程序
當標簽調度系統做創建封裝NFC標簽和識別信息的意圖,它發出的意圖,對於意圖過濾感興趣的應用程序。如果有多個應用程序可以處理的意圖,提出活動選配,以便用戶可以選擇的活動。標簽調度系統定義了三個意圖,這是在最高的順序列出來最低優先級:
ACTION_NDEF_DISCOVERED:此意圖是用來啟動一個活動時,它包含一個NDEF淨荷標簽的掃描和是一個公認的類型。這是最高優先級的意圖,並且標簽調度系統嘗試盡可能任何其他意圖,之前啟動這一意圖的活動。
ACTION_TECH_DISCOVERED:如果沒有活動登記辦理ACTION_NDEF_DISCOVERED意圖,標簽調度系統試圖啟動與此意向的應用程序。此意向也直接啟動(不啟動ACTION_NDEF_DISCOVERED第一),如果被掃描的標簽包含無法映射到MIME類型或URI NDEF數據,或者如果標簽不包含NDEF數據,但是是一個已知的標簽技術。
ACTION_TAG_DISCOVERED:如果沒有活動處理ACTION_NDEF_DISCOVERED或ACTION_TECH_DISCOVERED意圖這意圖開始。
標簽調度系統工作的基本方法如下:
嘗試啟動與由標簽調度系統解析NFC標簽(無論是ACTION_NDEF_DISCOVERED或ACTION_TECH_DISCOVERED)時創建的意圖的活動。
如果這一意圖沒有活動過濾器,嘗試啟動下一個優先級最低的意圖(無論是ACTION_TECH_DISCOVERED或ACTION_TAG_DISCOVERED)的活動,直到意圖或直至標簽調度系統中的應用程序過濾器嘗試所有可能的目的。
如果沒有應用程序篩選任何意圖的,什麼也不做。
只要有可能,以NDEF消息和ACTION_NDEF_DISCOVERED意圖工作,因為它是最特定出的三個。此意向,您可以在比其他兩個意圖更適當的時間啟動應用程序,給用戶更好的體驗。
請求在Android清單NFC訪問
在可以訪問設備的NFC硬件,妥善處理NFC意圖,聲明在AndroidManifest.xml文件以下項目:
該NFC<使用許可權>元素訪問NFC硬件:
最低SDK版本,你的應用程序可以支持。 API級9只支持通過ACTION_TAG_DISCOVERED有限標簽調度,並只給出了通過額外的NDEF郵件中多余的訪問NDEF消息。沒有其他標簽屬性或I / O操作都可以訪問。 API級別10包括全面的讀/寫支持,以及前景NDEF推搡,和API級14提供了一個更簡單的方法來推動NDEF消息,Android Beam功能和額外的便利方法的其他設備來創建NDEF記錄。
用途特征元素所以只有您的應用程序在谷歌顯示出來玩的有NFC硬件設備:
如果應用程序使用NFC功能,但該功能是不是你的應用是至關重要的,你可以省略的用途,特征元素,並檢查是否getDefaultAdapter()是空在運行時檢查NFC avalailbility。
濾波NFC意圖
當你要處理的NFC標簽被掃描啟動應用程序,應用程序可以過濾一,二,或在Android清單所有三個NFC意圖的。但是,你通常要過濾為您的應用程序啟動時的最大控制ACTION_NDEF_DISCOVERED意圖。該ACTION_TECH_DISCOVERED目的是ACTION_NDEF_DISCOVERED回退時ACTION_NDEF_DISCOVERED或沒有應用程序過濾器時,有效載荷不NDEF。濾波ACTION_TAG_DISCOVERED通常過於籠統的類別進行過濾的。許多應用程序將用於ACTION_NDEF_DISCOVERED或行動TECH_DISCOVERED過濾ACTION_TAG_DISCOVERED之前,讓您的應用程序啟動的概率很低。 ACTION_TAG_DISCOVERED僅作為應用程序的最後手段在沒有其他應用程序安裝處理ACTION_NDEF_DISCOVERED或ACTION_TECH_DISCOVEREDintent的情況下進行過濾。
因為NFC標簽部署各不相同,是不是你的控制之下了很多次,這並不總是可能的,這就是為什麼你可以在必要時回退到其他兩個意圖。當你有過的類型標簽和寫入的數據控制,建議您使用NDEF格式化您的代碼。下面的章節描述了如何為每種類型的意圖進行篩選。
ACTION_NDEF_DISCOVERED
若要篩選ACTION_NDEF_DISCOVERED意圖,與您要篩選的數據類型以及聲明的意圖過濾器。對於ACTION_NDEF_DISCOVERED意圖用MIME類型text / plain的下面的例子過濾器:
下面的例子在http://developer.android.com/index.html形式濾波器為一個URI。
ACTION TECH_DISCOVERED
如果在你的行動活動的過濾TECH_DISCOVERED意圖,你必須創建一個指定的活動支持高科技列表集內的技術的XML資源文件。您的活動被認為是一個匹配,如果高科技列表集是由標簽支持的技術,它可以通過調用getTechList獲得()的一個子集。
例如,如果被掃描的標簽支持MifareClassic,NdefFormatable和NFCA,你的技術列表設置必須按順序指定所有三,二,或技術(沒有別的)之一進行匹配您的活動。
下面的示例定義了所有的技術。您可以刪除不需要的人。保存該文件(你可以將其命名為任何你願意的話)在<項目根目錄>/ RES / XML的文件夾中。
android.nfc.tech.IsoDep
android.nfc.tech.NfcA
android.nfc.tech.NfcB
android.nfc.tech.NfcF
android.nfc.tech.NfcV
android.nfc.tech.Ndef
android.nfc.tech.NdefFormatable
android.nfc.tech.MifareClassic
android.nfc.tech.MifareUltralight
您也可以指定多個高科技列表集。每個高科技列表套獨立考慮,你的行為被認為是一個比賽,如果任何一個高科技列表集是由getTechList()返回的技術的一個子集。這提供AND和OR語義匹配技術。下面的例子相匹配,可以支持NFCA和NDEF技術或可以支持NFC和NDEF技術代碼:
android.nfc.tech.NfcA
android.nfc.tech.Ndef
android.nfc.tech.NfcB
android.nfc.tech.Ndef
在AndroidManifest.xml文件指定<活動>元素中就像在下面的例子中的元素,你只是在<元數據>創建的資源文件:
...
...
有關與標簽技術和動作TECH_DISCOVERED意圖,請參閱使用高級NFC文件中支持的標簽技術的更多信息。
ACTION_TAG_DISCOVERED
為了篩選ACTION_TAG_DISCOVERED使用以下意圖過濾器
從意向獲取信息
如果活動開始,因為NFC的意圖,可以獲取有關從意圖掃描NFC標簽的信息。意圖可以包含取決於被掃描標簽下面的演員:
EXTRA_TAG(必需):代表掃描標簽的標簽對象。
EXTRA_NDEF_MESSAGES(可選):從標簽解析NDEF消息的數組。這個額外是ACTION_NDEF_DISCOVERED意圖強制性的。
EXTRA_ID(可選):標簽的低級別的ID。
要獲得這些額外檢查,看看你的活力與NFC意圖之一推出,以確保標簽被掃描,然後獲得額外出來的意圖。對於ACTION_NDEF_DISCOVERED意圖下面的例子檢查,並會從一個意圖額外的NDEF消息。
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
}
另外,您也可以從意向,其中將包含有效載荷,並允許您列舉標記的技術的Tag對象:
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
創建NDEF記錄的常見類型
本節將介紹如何創建常見類型的NDEF記錄,以幫助您寫入NFC標簽或Android Beam功能發送數據時。采用Android4.0(API等級14),該createUri()方法可以幫助你自動創建URI記錄開始。在搭載Android 4.1(API等級16),createExternal()和createMime()啟動可幫助您創建MIME和外置型NDEF記錄。使用這些輔助方法盡可能避免失誤手動創建NDEF記錄時。
本節還介紹了如何創建備案相應的意圖過濾器。所有這些NDEF記錄的例子應該是你正在寫標簽或喜氣洋洋的NDEF消息的第一NDEF紀錄。
BUILD_ABSOLUTE_URI
注意:我們建議您使用RTD_URI類型,而不是TNF_ABSOLUTE_URI,因為它是更有效的。
您可以在以下方式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]);
前一個NDEF記錄的意圖過濾器是這樣的:
TNF MIME媒體
您可以在通過以下方式TNF MIME媒體NDEF記錄:
使用createMime()方法:
NdefRecord mimeRecord = NdefRecord.createMime("application/vnd.com.example.android.beam",
"Beam me up, Android".getBytes(Charset.forName("US-ASCII")));
手動創建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")));
前一個NDEF記錄的意圖過濾器是這樣的:
TNF_WELL_KNOWN與RTD_TEXT
您可以在以下方式TNF眾所周知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;
}
意圖過濾器是這樣的:
TNF_WELL_KNOWN與RTD_URI
您可以在通過以下方式TNF眾所周知NDEF記錄:
使用createUri(String)方法:
NdefRecord rtdUriRecord1 = NdefRecord.createUri("http://example.com");
使用創建的URI(URI)的方法:
Uri uri = new Uri("http://example.com");
NdefRecord rtdUriRecord2 = NdefRecord.createUri(uri);
手動創建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);
前一個NDEF記錄的意圖過濾器是這樣的:
TNF_EXTERNAL_TYPE
您可以在通過以下方式TNF外置式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);
手動創建NdefRecord:
byte[] payload;
...
NdefRecord extRecord = new NdefRecord(
NdefRecord.TNF_EXTERNAL_TYPE, "com.example:externalType", new byte[0], payload);
前一個NDEF記錄的意圖過濾器是這樣的:
使用更多通用的NFC標簽部署TNF_EXTERNAL_TYPE,以更好地支持Android的供電和非Android設備。
注:TNF_EXTERNAL_TYPE的URN有一個規范的格式:金塔:NFC:分機:example.com:externalType,但是NFC論壇RTD規范聲明金塔:N??FC:EXT:甕的部分必須從NDEF記錄中ommitted。因此,所有你需要提供是用冒號隔開(在本例中example.com)域和類型(externalType中的例子)。 NFC:分機:example.com:當調度TNF_EXTERNAL_TYPE,Android的骨灰盒轉換externalType URN到vnd.android.nfc://ext/example.com:externalType URI,這是在這個例子的意圖過濾器聲明。
Android應用程序記錄
在Android 4.0的(API級別14)推出一個Android應用程序記錄(AAR)提供了一個更強的確定性,當一個NFC標簽被掃描應用程序已啟動。一個AAR具有內嵌在NDEF記錄中的應用程序的包名。您可以添加一個AAR您NDEF消息的任何NDEF紀錄,因為Android的搜索整個NDEF消息AARS。如果找到一個AAR,它開始基礎上,AAR內的包名的應用程序。如果應用程序是不存在的設備上,谷歌播放啟動下載應用程序。
如果你想防止其他應用程序過濾相同的意圖和潛在的處理已部署特定的標簽奧爾斯是有用的。奧爾斯只支持在應用層面,因為包名的約束,而不是在活動水平意圖過濾。如果你想在活動層次來處理意圖,使用意圖過濾器。
如果一個標簽包含一個AAR,標簽調度系統調度的方式如下:
嘗試使用一個意圖過濾器正常啟動的活動。如果意圖相匹配的活動的AAR也匹配,啟動活動。
如果,對於意圖不匹配AAR過濾活動,如果多個活動可以處理的意圖,或者如果沒有活動處理的意圖,啟動由AAR的指定的應用程序。
如果沒有應用程序可以與AAR開始,去谷歌Play下載基於AAR的應用程序。
注意:您可以覆蓋AARS和前景調度系統,它允許當一個NFC標簽被發現前景活動具有優先權的意圖調度系統。用這種方法,活動必須在前台覆蓋AARS和意圖調度系統。
如果您仍然要篩選不包含AAR掃描標簽,你可以正常聲明意圖過濾器。如果您的應用程序感興趣的是不包含AAR等標簽,這非常有用。例如,也許你要保證你的應用程序處理您部署專用標記以及由第三方部署的一般標簽。請記住,奧爾斯具體到Android 4.0設備或更高版本,所以在部署時的標簽,你最有可能要使用奧爾斯和MIME類型/的URI的組合,支持設備的范圍最廣。此外,當您部署NFC標簽,想想你想怎麼寫你的NFC標簽,以便在大多數設備(Android平台和其他設備)的支持。您可以通過定義一個相對獨特的MIME類型或URI,使其更容易為應用程序來區分做到這一點。
Android提供了一個簡單的API來創建一個AAR,createApplicationRecord()。所有你需要做的是在你隨時隨地NdefMessage嵌入AAR。你不想用你的NdefMessage的第一個記錄,除非AAR是在NdefMessage的唯一記錄。這是因為Android系統檢查的NdefMessage的第一條記錄,從而確定標簽,這是用於創建應用程序過濾意圖的MIME類型或URI。下面的代碼演示如何創建一個AAR:
NdefMessage msg = new NdefMessage(
new NdefRecord[] {
...,
NdefRecord.createApplicationRecord("com.example.android.beam")}
喜氣洋洋NDEF消息給其它設備
Android Beam功能允許兩款Android供電設備之間的簡單對等網絡的數據交換。一個想要束數據到另一設備的應用程序必須是在前台和設備收到該數據不能被鎖定。當喜氣洋洋設備自帶與接收設備足夠近的接觸,燦爛的設備顯示“觸摸到梁”UI。然後,用戶可以選擇是否要光束的消息到接收裝置。
注:前台NDEF推是可在API級別10,它提供了類似的功能用於Android Beam。這些API有不被提倡,但可用於支持老設備。有關更多信息,請參見enableForegroundNdefPush()。
您可以通過調用兩種方法之一啟用Android Beam功能為您的應用:
setNdefPushMessage():接受一個NdefMessage設置作為消息到光束。自動光束當兩個設備都足夠接近該消息。
setNdefPushMessageCallback():接受包含createNdefMessage()當設備處於范圍束數據到被調用的回調。回調可讓您只創建NDEF消息,如果必要。
活動僅可以一次推1 NDEF消息,所以setNdefPushMessageCallback()優先於setNdefPushMessage()如果兩者都設置。要使用Android Beam功能,下面的一般准則必須滿足:
這喜氣洋洋的數據的行為必須是在前台。這兩款器件必須有自己的屏幕解鎖。
你必須封裝您在NdefMessage對象喜氣洋洋的數據。
正在接收橫梁數據必須支持com.android.npp NDEF推送協議或NFC論壇的SNEP(簡單NDEF交換協議)NFC設備。該com.android.npp協議需要在API 9級設備(Android 2.3的)到API等級13(Android 3.2的)。 com.android.npp和SNEP都需要在API級別14(Android 4.0版本)及更高版本。
注意:如果您的活動使Android Beam功能,並在前台,標准的意圖調度系統被禁用。但是,如果你的活動也使前景調度,那麼它仍然可以掃描匹配在前台調度設置意圖過濾器標簽。
要啟用Android Beam功能:
創建包含要推到其他設備NdefRecords的NdefMessage。
呼叫setNdefPushMessage()與NdefMessage或致電setNdefPushMessageCallback傳遞一個NfcAdapter.CreateNdefMessageCallback對象在活動的onCreate()方法。這些方法要求要啟用Android Beam功能,與其他活動的可選列表,以激活沿至少一個活動。
一般情況下,通常使用setNdefPushMessage(),如果你的活動只需要在任何時候都推相同NDEF消息,當兩個設備在范圍內進行通信。您可以使用setNdefPushMessageCallback當你的應用程序關心應用程序的當前上下文,並希望推動這取決於用戶在應用程序中做一個NDEF消息。
下面的示例顯示了一個簡單的活動在活動的onCreate()方法是如何調用NfcAdapter.CreateNdefMessageCallback(見AndroidBeamDemo獲取完整的示例)。這個例子也有方法可以幫助您創建一個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,你可以刪除。如果啟用了AIR,在AAR指定的應用程序總是收到Android Beam的消息。如果應用程序不存在,谷歌播放開始下載應用程序。因此,如果使用的AAR以下意圖過濾器是不適合的Android4.0設備或更高技術上必需的:
有了這個意圖過濾器中,com.example.android.beam應用程序現在可以在掃描NFC標簽或接收到的Android梁式com.example.android.beam的AAR,或當NDEF格式的消息包含一個開始類型應用程序/ vnd.com.example.android.beam的MIME紀錄。
即使AARS保證應用程序啟動或下載,推薦意圖過濾器,因為他們讓你在你的應用程序啟動您所選擇的活動,而不是總是在啟動由AAR指定的包內的主要活動。 AARS沒有活動水平的粒度。同時,由於一些Android設備不支持奧爾斯,你也應該嵌入識別您的NDEF消息的第一NDEF記錄和過濾器的信息,以及,以防萬一。請參閱有關如何創建記錄的詳細信息創建的NDEF記錄的常見類型。