轉自 http://blog.csdn.net/think_soft/article/details/8184539html
從Intent中獲取信息android
若是由於NFC的Intent而啓動一個Activity,那麼你就可以從Intent中獲取被掃描到的NFC標籤的相關信息。根據被掃描到的標籤,Intent對象可以如下額外的信息:數組
1. EXTRA_TAG(必須的):它是一個表明了被掃描到的標籤的Tag對象;app
2. EXTRA_NDEF_MESSAGES(可選):它是一個解析來自標籤中的NDEF消息的數組。這個附加信息是強制在Intent對象上的;dom
3. {@link android.nfc.NfcAdapter#EXTRA_ID(可選):標籤的低級ID。spa
要獲取這些附加信息,就要確保你的Activity是被掃描到的NFC的Intent對象啓動的,而後才能得到Intent以外的附加信息。下例檢查ACTION_NDEF_DISCOVERED類型的Intent,並從Intent對象的附加信息中獲取NDEF消息。.net
public void onResume() {code
super.onResume();htm
...對象
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對象中得到一個Tag對象,該對象包含了數據負載,並容許你列舉標籤的技術:
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
建立通用的NDEF記錄類型
本節介紹如何建立通用的NDEF記錄類型,以便幫助你向NFC標籤寫入或用Android Beam發送數據。從Android4.0(API Level14)開始,能夠用createUri()方法來幫助你自動的建立URI記錄。從Android4.1(API Level 16)開始,能夠用createExternal()和createMime()方法來幫助你建立MIME和外部類型的NDEF記錄。使用這些輔助方法會盡量的避免手動建立NDEF記錄的錯誤。
本節還要介紹如何建立NDEF記錄對應的Intent過濾器。全部的這些寫入或發送到NFC標籤的NDEF記錄例子都應該是NDEF消息的第一條記錄。
TNF_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]);
對應的Intent過濾器以下:
<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
使用下列方法建立TNF_MIME_MEDIA類型的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")));
對應的Intent過濾器以下:
<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和RTD_TEXT
用下列方法建立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;
}
對應的Intent過濾器以下:
<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_KNOW和RTD_URI
用下列方法建立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);
手動的建立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);
對應的Intent過濾器以下:
<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
使用下列方法建立TNF_EXTERNAL_TYPE類型的記錄。
使用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);
對應的Intent過濾器以下:
<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類型NFC部署,以便更好的支持Android設備和非Android設備。
注意:TNF_EXTERNAL_TYPE類型的URN包含如下格式:
urn:nfc:ext:example.com.externalType,可是,NFC論壇的RTD規範聲明,URN的urn:nfc:ext:部分在NDEF記錄中必須忽略。所以你須要提供的全部信息是用「:」號把域名(示例中的example.com)和類型(示例中的externalType)分離開。在調度TNF_EXTERNAL_TYPE類型的記錄時,Android會把urn:nfc:ext:example.com:externalType的URN轉換成vnd.android.nfc://ext/example.com:externalType的URI,它是在示例中聲明的Intent過濾器。