转自 http://blog.csdn.net/think_soft/article/details/8169483html
本文译自:http://developer.android.com/guide/topics/connectivity/nfc/nfc.htmlandroid
本文介绍在Android系经过你所能执行的基本任务。它解释了如何用NDEF消息格式来发送和接收NFC数据,而且介绍了支持这些功能的Android框架API。有关更高级的话题,包括对非NDEF格式数据的讨论,状况“高级 NFC”浏览器
NDEF数据和Android一块儿工做的场景主要有两个:框架
1. 从NFC标签中读取NDEF数据;dom
2. 把NDEF消息从一个设备发送给另外一个设备。ide
从NFC标签中读取NDEF数据是用标签调度系统来处理的,它会分析被发现的NFC标签,对数据进行适当的分类,并启动对该类数据感兴趣的应用程序。想要处理被扫描到NFC标签的应用程序会声明一个Intent过滤器,并请求处理数据。ui
Android Beam™ 功能容许设备把一个NDEF消息推送到物理上相互监听的另外一个设备上。这种交互提供了比其余无线技术(如蓝牙)更容易的发送数据的方法。由于NFC不须要手动的设备发现或配对要求。两个设备在接近到必定范围时会自动的链接。Android Beam经过一组NFC API来使用,以便应用程序可以在设备之间来传输信息。例如,通讯录、浏览器以及YouTube等应用程序都使用Android Beam来跟其余设备共享通讯录、网页和视频。编码
NFC标签调度系统spa
一般,除非是在设备的设置菜单中NFC被禁用,不然Android设备会在非锁屏的状态下搜索NFC。当Android设备发现NFC标签时,指望的行为是用最合适的Activity来处理该Intent,而不是询问用户使用什么应用程序。由于设备只能在很短的范围内扫描到NFC标签,强制的让用户手动的选择一个Activity,会致使设备离开NFC标签,从而中断该链接。你应该开发你本身的Activity来处理你所关心的NFC标签,从而阻止 选择器的操做。.net
为了帮助你达到这个目标,Android提供了特殊的标签调度系统,来分析扫描到的NFC标签,经过解析数据,在被扫描到的数据中尝试找到感兴趣的应用程序,具体作法以下:
1. 解析NFC标签并搞清楚标签中标识数据负载的MIME类型或URI;
2. 把MIME类型或URI以及数据负载封装到一个Intent中。
3. 基于Intent来启动Activity。
怎样把NFC标签映射到MIME类型和URI
开始编写NFC应用程序以前,重要的是要理解不一样类型的NFC标签、标签调度系统是如何解析NFC标签的、以及在检测到NDEF消息时,标签调度系统所作的特定的工做等。NFC标签涉及到普遍的技术,而且有不少不一样的方法向标签中写入数据。Android支持由NFC Forum所定义的NDEF标准。
NDEF数据被封装在一个消息(NdefMessage)中,该消息中包含了一条或多条记录(NdefRecord)。每一个NDEF记录必须具备良好的你想要建立的记录类型的规范的格式。Android也支持其余的不包含NDEF数据类型的标签,你可以使用android.nfc.tech包中的类来工做。要使用其余类型标签来工做,涉及到编写本身的跟该标签通讯的协议栈,所以咱们建议你尽量的使用NDEF,以便减小开发难度,而且最大化的支持Android设备。
注意:要下载完整的NDEF规范,请去“NFC论坛规范下载”网址来下载。
如今,你已经具有了一些NFC标签的背景知识,接下来要详细的介绍Android是如何处理NDEF格式的标签的。当Android设备扫描到包含NDEF格式数据的NFC标签时,它会解析该消息,并尝试搞清楚数据的MIME类型或URI标识。首先系统会读取消息(NdefMessage)中的第一条NdefRecord,来判断如何解释整个NDEF消息(一个NDEF消息可以有多条NDEF记录)。在格式良好的NDEF消息中,第一条NdefRecord包含如下字段信息:
3-bit TNF(类型名称格式)
指示如何解释可变长度类型字段,在下表1中介绍有效值。
可变长度类型
说明记录的类型,若是使用TNF_WELL_KNOWN,那么则使用这个字段来指定记录的类型定义(RTD)。在下表2中定义了有效的RTD值。
可变长度ID
惟一标识该记录。这个字段不常用,可是,若是须要惟一的标识一个标记,那么就能够为该字段建立一个ID。
可变长度负载
你想读/写的实际的数据负载。一个NDEF消息可以包含多个NDEF记录,所以不要觉得在NDEF消息的第一条NDEF记录中包含了全部的负载。
标签调度系统使用TNF和类型字段来尝试把MIME类型或URI映射到NDEF消息中。若是成功,它会把信息跟实际的负载一块儿封装到ACTION_NEDF_DISCOVERED类型的Intent中。可是,会有标签调度系统不能根据第一条NDEF记录来判断数据类型的状况,这样就会有NDEF数据不能被映射到MIME类型或URI,或者是NFC标签没有包含NDEF开始数据的状况发生。在这种状况下,就会用一个标签技术信息相关的Tag对象和封装在ACTION_TECH_DISCOVERED类型Intent对象内部的负载来代替。
表1.介绍标签调度系统映射如何把TNF和类型字段映射到MIME型或URI上。同时也介绍了那种类型的TNF不能被映射到MIME类型或URI上。这种状况下,标签调度系统会退化到ACTION_TECH_DISCOVERED类型的Intent对象。
例如,若是标签调度系统遇到一个TNF_ABSOLUTE_URI类型的记录,它会把这个记录的可变长度类型字段映射到一个URI中。标签调度系统会把这个URI跟其余相关的标签的信息(如数据负载)一块儿封装到ACTION_NDEF_DISCOVERED的Intent对象中。在另外一方面,若是遇到了TNF_UNKNOWN类型,它会建立一个封装了标签技术信息的Intent对象来代替。
表1.所支持的TNF和它们的映射
类型名称格式(TNF) |
映射 |
TNF_ABSOLUTE_URI |
基于类型字段的URI |
TNF_EMPTY |
退化到ACTION_TECH_DISCOVERED类型的Intent对象 |
TNF_EXTERNAL_TYPE |
基于类型字段中URN的URI。URN是缩短的格式(<domain_name>:<service_name)被编码到NDEF类型中。Android会把这个URN映射成如下格式的URI:vnd.android.nfc://ext/<domain_name>:<service_name>。 |
TNF_MIME_MEDIA |
基于类型字段的MIME类型 |
TNF_UNCHANGED |
退化到ACTION_TECH_DISCOVERED类型的Intent对象 |
TNF_UNKNOWN |
退化到ACTION_TECH_DISCOVERED类型的Intent对象 |
TNF_WELL_KNOWN |
依赖你在类型字段中设置的记录类型定义(RTD)的MIME类型或URI, |
表2.TNF_WELL_KNOWN所支持的RTD和它们的映射
记录类型定义(RTD) |
映射 |
RTD_ALTERNATIVE_CARRIER |
退化到ACTION_TECH_DISCOVERED类型的Intent对象 |
RTD_HANDOVER_CARRIER |
退化到ACTION_TECH_DISCOVERED类型的Intent对象 |
RTD_HANDOVER_REQUEST |
退化到ACTION_TECH_DISCOVERED类型的Intent对象 |
RTD_HANDOVER_SELECT |
退化到ACTION_TECH_DISCOVERED类型的Intent对象 |
RTD_SMART_POSTER |
基于负载解析的URI |
RTD_TEXT |
text/plain类型的MIME |
RTD_URI |
基于有效负载的URI |