转自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过滤器。

Android近场通信---NFC基础(四)(转)的更多相关文章

  1. Android近场通信---NFC基础转)

    Android近场通信---NFC基础(一)(转) 本文介绍在Android系通过你所能执行的基本任务。它解释了如何用NDEF消息格式来发送和接收NFC数据,并且介绍了支持这些功能的Android框架 ...

  2. Android近场通信---NFC基础(一)(转)

    转自 http://blog.csdn.net/think_soft/article/details/8169483 本文译自:http://developer.android.com/guide/t ...

  3. Android近场通信---NFC基础(五)(转)

    转自 http://blog.csdn.net/think_soft/article/details/8190463 Android应用程序记录(Android Application Record- ...

  4. Android近场通信---NFC基础(三)(转)

    转自 http://blog.csdn.net/think_soft/article/details/8180203 过滤NFC的Intent 要在你想要处理被扫描到的NFC标签时启动你的应用程序,可 ...

  5. Android近场通信---NFC基础(二)(转)

    转自 http://blog.csdn.net/think_soft/article/details/8171256 应用程序如何调度NFC标签 当标签调度系统完成对NFC标签和它的标识信息封装的In ...

  6. Android近场通信---高级NFC(二)

    读写NFC标签 读写NFC标签,要涉及到从Intent对象中获取标签,并要打开与标签的通信.要读写NFC标签数据,你必须要定义自己的协议栈.但是,要记住在直接使用NFC标签工作时,你依然能够读写NDE ...

  7. NFC:Arduino、Android与PhoneGap近场通信

    NFC:Arduino.Android与PhoneGap近场通信(第一本全面讲解NFC应用开发的技术著作移动智能设备近距离通信编程实战入门) [美]Tom Igoe(汤姆.伊戈),Don Colema ...

  8. Android NFC近场通信1——NFC概述

    最近对NFC挺感兴趣,而且新换的手机也支持NFC功能(最近换了Find5,感觉还不错O(∩_∩)O),所以打算学学NFC编程.NFC就是我们经常说的近场通信.通常距离是4厘米或更短.NFC工作频率是1 ...

  9. Android NFC近场通信03----读写MifareClassic卡

                                           Android NFC近场通信02----读写MifareClassic卡 一.MifareClassic卡 相关 一般来 ...

随机推荐

  1. 使用Primose方式解决异步编程回调的一些问题--animate动画的例子

    function animate(dis, time) { var def = $.Deferred(); $('.boll') .animate({ left: dis + 'px' }, time ...

  2. SURF matlab 检测函数使用

    1.这篇介绍SURF检测blob的函数. 函数/Functions 函数名称:detectSURFFeatures 功能:利用The Speeded-Up Robust Features(SURF)算 ...

  3. 获取app-package和app-activity的值

    方法一 原文链接:http://mp.weixin.qq.com/s/KTkfmibSoaGOmDazJmZ8Sw 利用appium图形界面和已有的apk文件获取package和activity. 点 ...

  4. 基于BASYS2的VHDL程序——交通灯

    请尊重作者版权,转载请注明原地址: http://www.cnblogs.com/connorzx/p/3676746.html 数电实验交通灯VHDL版,程序写的扩展性很差,待以后有时间进行优化. ...

  5. hdu 1106 排序 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1106 这个题目一开始以为是水题,就想着用来轻松轻松,谁知道改得我想吐!! 除了discuss 中的数据 ...

  6. Windows内存性能分析(一)内存泄漏

    判断内存性能表现主要是为了解决如下两个问题: 1. 当前web应用是否存在内存泄漏,如果有,问题的程度有多大? 2. 如果web应用的代码无法进一步改进,当前web应用所在的服务器是否存在内存上的瓶颈 ...

  7. linux应用之tomcat的安装及配置(centos)

    CentOS 6.6下安装配置Tomcat环境 [日期:2015-08-25] 来源:Linux社区  作者:tae44 [字体:大 中 小]   实验系统:CentOS 6.6_x86_64 实验前 ...

  8. yii表单的各种验证

    /验证规则详细配置 public function rules() { // NOTE: you should only define rules for those attributes that ...

  9. IOS微信禁用分享跳转页面返回BUG修复

    fresh(); function fresh() { let isPageHide = false; window.addEventListener('pageshow', function () ...

  10. Android-Styles and Themes [From API Guide]

    This blog was opened 5 months ago and it has 57 posts now,but the poor thing is by now no one has co ...