Android近场通信---NFC基础(四)

转自:http://blog.csdn.net/think_soft/article/details/8184539


从Intent中获取信息

如果因为NFC的Intent而启动一个Activity,那么你就能够从Intent中获取被扫描到的NFC标签的相关信息。根据被扫描到的标签,Intent对象能够以下额外的信息:

1.  EXTRA_TAG(必须的):它是一个代表了被扫描到的标签的Tag对象;

2.  EXTRA_NDEF_MESSAGES(可选):它是一个解析来自标签中的NDEF消息的数组。这个附加信息是强制在Intent对象上的;

3.  {@link android.nfc.NfcAdapter#EXTRA_ID(可选):标签的低级ID。

要获取这些附加信息,就要确保你的Activity是被扫描到的NFC的Intent对象启动的,然后才能获得Intent之外的附加信息。下例检查ACTION_NDEF_DISCOVERED类型的Intent,并从Intent对象的附加信息中获取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

}

此外,你还能够从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过滤器。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值