NFC基本原理
本文档介绍了Android中NFC执行的基本任务。它说明了如何发送和接收
NDEF格式的NFC数据,并介绍了支持这些功能AndroidFrameworkAPIs。需要
了解更多,其中包括与非NDEF数据工作的讨论,见高级NFC。
Android和NDEF数据的交互工作,有两个主要用途情况:
•阅读来自NFC标签的NDEF数据
•利用AndroidBeaming机制从一个设备到另一个设备发送NDEF消息
阅读来自NFC标签的NDEF数据,是由标签调度系统来处理的,该系统分
析发现NFC标签,适当的对数据进行分类,并启动一个对分类数据感兴趣的应
用。对要处理扫描NFC标签的应用程序可以声明一个意向筛选,并要求处理该
数据。
通过同时触发另一台设备,AndroidBeaming机制的功能允许设备推送一个
NDEF消息到另一台设备。这种交互比其他无线技术如蓝牙,提供了一个简单的
方法发送数据,因为通过NFC,无需手动发现或配对装置。当两个设备靠近到
一定程度时,自动连接。可以通过一系列NFCAPIs,AndroidBeaming机制都能
起作用,所以任何应用都可以传输设备之间的信息。例如,联系人,浏览器和
YouTube应用程序通过使用AndroidBeaming机制,与其他设备来共享联系人,
网页和视频。
一、标签发布系统
除非NFC功能在设备的设置菜单中禁用,不然在屏幕未被锁定时,Android
设备通常是寻找NFC标签。当一个Android设备发现了一个NFC标签,所期望
的行为是,不询问用户使用什么样的应用,而是以最合适的activity处理意向。
由于设备扫描NFC标签是在很短的范围内,很容易让用户手动选择一个activity
而将迫使他们远离标签并断开连接。你可以定制你的activity,只处理其关心的
NFC标签,以阻止出现“Activity选择列表”。
为了帮助您实现这个目标,Android提供了一个特殊的标记发布系统,分析
扫描NFC标签,解析它们,并试图找到对扫描数据感兴趣的应用。它通过:
1.解析NFC标签和搞清楚的MIME类型或标识标签中一个URI的有效数据。
2.把MIME或URI和有效数据压缩进意向里。前两个步骤的描述,在下一
节(NFC标签如何被映射到MIME类型和URI)详述。
3.基于意向启动一个activity。这在再下一节(NFC标签如何被分派到应用
程序)里详述。
*
###NFC标签如何被映射到MIME类型和URI
在你开始写你的NFC应用,重要的是要了解不同类型的NFC标签的,标签
调度系统如何解析NFC标签,标签调度系统的专项整治工作时检测NDEF的消
息。NFC标签来在各种各样的技术,还可以有许多不同的方式写在他们的数据。
Android有NFC论坛定义的NDEF标准,这是大多数的支持。
NDEF数据封装内包含一个或多个记录(NdefRecord)的消息(NdefMessage)。
每个NDEF记录必须根据你要创建的记录类型,规格,形成。Android还支持
其他类型的标签不包含NDEF的数据,你可以使用在包类。要
了解有关这些技术的更多信息,请参阅高级NFC主题。与其他类型的标记这些
工作包括编写自己的协议栈与标签进行通信,所以我们建议NDEF在可能的情
况下发展的易用性和最大支持Android的供电设备使用。
注:要下载完整NDEF的规格,去NFC论坛规范下载网站,看到创建常见
的类型如何构造NDEF记录的例子NDEF记录。
现在,你有NFC标签的背景下,以下各节描述更详细的Android如何处理
NDEF格式化标签。当一个Android供电设备扫描NFC标签NDEF格式的数据,
它解析的消息,并试图找出数据的MIME类型或标识的URI。要做到这一点,
该系统读取内部NdefMessageNdefRecord,以确定如何解释的的整个NDEF消息
(NDEF消息可以有多个NDEF记录)。在一个格式良好的NDEF消息,第一
NdefRecord包含以下字段:
3位肿瘤坏死因子(类型名称格式)
指示如何解释变量长度类型字段。有效的值在表1中。
可变长度类型
描述记录类型。如果使用TNF_WELL_KNOWN,使用此字段指定的记录类型定
义(RTD)。有效的电阻值见表2。
可变长度的ID
一个记录的唯一标识符。这个领域是不是经常使用,但如果您需要唯一标识标签,
你可以为它创建一个ID。
可变长度的有效载荷
要读或写的实际数据有效载荷。一个NDEF消息可以包含多个NDEF记录,所
以不承担充分的有效载荷是在的NDEF消息的第一NDEF纪录。
标签调度系统使用肿瘤坏死因子和类型字段对应的MIME类型,或URI的
NDEF消息,。如果成功,它封装里面一个ACTION_NDEF_DISCOVERED意向
与实际载荷的信息。不过,也有标签调度系统的情况下,当不能确定基于第一
NDEF记录的数据类型。发生这种情况,当NDEF数据不能被映射到一个MIME
类型或URI,或者时NFC标签不包含NDEF的数据,开始。在这种情况下,有
一个标签对象标签的技术信息和有效载荷封装里面的意向,而不是一个
ACTION_TECH_DISCOVERED。
表1。介绍了如何标记调度系统地图肿瘤坏死因子和类型字段MIME类型或URIs。
它还介绍了这的TNFs不能映射到MIME类型或URI。在这些情况下,标签调度
系统回落到ACTION_TECH_DISCOVERED的。
例如,如果标签调度系统遇到一个记录类型TNF_ABSOLUTE_URI,它映射到一
个URI,该记录的可变长度的类型字段。标签调度系统封装在数据字段,以及与
其他信息的标签,如有效载荷,ACTION_NDEF_DISCOVERED意向URI。另一
方面,如果遇到类型TNF_UNKNOWN的纪录,它创建一个封装标签的技术,
而不是意向。
*
NFC标签是如何发送至应用程序
当标签发布系统完成了创建一个压缩NFC标签和它的识别信息的意向,就
将该意向发送到感兴趣的应用程序,此应用程序再筛选该意向。如果多个应用程
序可以处理该意向,ActivityChoor将出现,以便用户选择Activity。标签调度
系统定义了三个意向,这是最高到最低优先级的顺序列出:
_NDEF_DISCOVERED:当一个标签包含NDEF有效数据和可识
别的类型时,此意向被用来启动一个Activity。这是最高优先级的意向,标签发
布系统在任何其他的意向之前,尽可能地尝试通过该意向启动一个Activity。
_TECH_DISCOVERED:如果没有activities登记来处理的
ACTION_NDEF_DISCOVERED的意向,标签发布系统尝试通过此意向启动应用
程序。如果扫描的标签包含NDEF数据不能被映射为MIME或者URI,或者如
果标签不包含NDEF数据但是一个已知的标签技术,该意向也直接启动(没有
启动ACTION_NDEF_DISCOVERED的前提下)。
_TAG_DISCOVERED:启动此意向,如果没有处理的
ACTION_NDEF_DISCOVERED或ACTION_TECH_DISCOVERED意向。
标签发布系统工作的基本方法如下:
1.当解析NFC标签时,尝试通过标签发布系统创建的意向来启动一个
Activity(无论是ACTION_NDEF_DISCOVERED或
ACTION_TECH_DISCOVERED)。
2.如果没有activities筛选该意向,尝试通过下一低优先级的意向(无论是
ACTION_TECH_DISCOVERED或ACTION_TAG_DISCOVERED)来
启动一个Activity,直到有一个应用程序筛选了该意向,或直至标签调
度系统尝试所有可能的意向为止。
3.如果没有任何意向的应用程序筛选器,什么也不做。
图1.标签发布系统
只要可能,NDEF消息和ACTION_NDEF_DISCOVERED的意向将会协同工
作,因为它是三个里最明确的。此意向,比其他两个意向,让您在更合适的时间
启动您的应用程序,并提供更好的用户体验。
二、访问NFC
在你可以访问NFC硬件设备和妥善处理的NFC的意向之前,需要在你的
文件中声明下面的这些项:
•NFC使用
最小SDK版本需要设置正确,APIlevel9只包含有限的tag支持,包括:
通过ACTION_TAG_DISCOVERED来发布Tag信息
只有通过EXTRA_NDEF_MESSAGES扩展来访问NDEF消息
其他的tag属性和I/O操作都不支持
API10级,包括全面支持读/写,以及前台NDEF推送。API14级提供了一
个更简单的方法,通过AndroidBeaming机制推送NDEF消息到其他设备,并以
更加方便的方法创建NDEF记录。
Us-feature元素使您的应用程序出现在GooglePlay中(仅支持有NFC硬
件的设备):
如果您的应用程序使用NFC功能,但该功能对您的应用程序并不重要,你
可以在运行时通过检查getDefaultAdapter()是空的,来删除us-feature元素和
禁用NFC功能。
三、筛选NFC的意向
当扫描到的标签是你想要处理的,则启动应用程序,您的应用程序可以在
Androidmainfest中筛选一,二,或所有三个意向。然而,当您的应用启动时,
您通常要为多个控制的ACTION_NDEF_DISCOVERED意向筛选。当没有应用
程序筛选到ACTION_NDEF_DISCOVERED或当有效信息不是NDEF时,
ACTION_TECH_DISCOVERED是ACTION_NDEF_DISCOVERED的备用选项。
ACTION_TAG_DISCOVERED是最普遍的类别,通常不需筛选。许多应用程序
将在ACTION_TAG_DISCOVERED之前,筛选ACTION_NDEF_DISCOVERED
或ACTION_TECH_DISCOVERED,使您的应用程序降低启动的概率。在没有其
他已安装的应用程序去处理ACTION_NDEF_DISCOVERED或
ACTION_TECH_DISCOVEREDintent时,ACTION_TAG_DISCOVERED是作为
最后采用的手段。
因为NFC标签部署各不相同,内容经常不可预测,这就是为什么在必要时
你可以退回到其他两个意向。当你对标签和书面数据的类型有控制权时,建议使
用NDEF格式化您的标签。以下各节描述如何筛选各类型的意向:
ACTION_NDEF_DISCOVERED
要筛选ACTION_NDEF_DISCOVERED意向,与您要筛选的数据类型一起,
声明意向筛选器。下面的例子为一个MIME类型text/plain的
ACTION_NDEF_DISCOVERED意向筛选器:
下面的例子为一个URI类型/的意向筛选器。
android:host=""
android:pathPrefix="/"/>
ACTION_TECH_DISCOVERED
如果您的activity是筛选ACTION_TECH_DISCOVERED意向,你必须创建
一个XML资源文件,在一个tech-list集里详细说明你的activity支持的技术。您
的活动被认为是匹配的,如果一个tech-list集是标签支持技术的子集,您可以通
过调用getTechList()来获取标签所支持的技术。
例如,如果被扫描的标签支持MifareClassic,NdefFormatable,NFCA,您的
tech-list集必须指定所有三个,三个中的两个或者一个技术(没有别的),以便
您的activity可以匹配。
下面的示例定义了所有的技术。你可以删除那些你不需要的。这个文件(可
以将其命名为你想要的名字)在
你也可以指定多个tech-list集。每个tech-list集被认为是独立的,你的活动
被认为是一场比赛,如果任何一个tech-list集是由getTechList()返回技术的一
个子集。这提供AND和OR语义匹配技术。下面的例子匹配的标签,可以支持
NFCA和NDEF技术的或可以支持NfcB和NDEF技术:
在您的文件,具体指定资源文件,您只需在内
元素
...
android:resource="@xml/nfc_tech_filter"/>
...
更多有关标签技术和ACTION_TECH_DISCOVERED的意向工作的信息,
请参阅高级NFC文档。
ACTION_TAG_DISCOVERED
用下面的筛选器筛选ACTION_TAG_DISCOVERED:
从意向获取信息
如果一个NFC意向启动了activity,你可以从意向中得到扫描到的NFC标
签的信息。取决于扫描到的标签,意向可以包含以下额外内容:
•EXTRA_TAG(必需):代表扫描标签一个标签对象。
•EXTRA_NDEF_MESSAGES(可选):从标签解析来的一系列NDEF消息。
这额外的内容是意向包含的。
•{@pter#EXTRA_ID(可选):低级别的ID标签。
要获得这些额外内容,请检查,您的activity是否带有NFC的一种意向被发
送了,以确保标签被扫描,然后获得了意向之外的额外信息。下面的例子检查为
ACTION_NDEF_DISCOVERED意向和得到的意向额外NDEF消息。
publicvoidonResume(){
me();
...
if(_NDEF_(getIntent().getAction())){
Parcelable[]rawMsgs=
celableArrayExtra(_NDEF_MESSAGES);
if(rawMsgs!=null){
msgs=newNdefMessage[];
for(inti=0;i<;i++){
msgs[i]=(NdefMessage)rawMsgs[i];
}
}
}
//processthemsgsarray
}
或者,您能从意向中获得一个标记对象,它将包含有效信息并且允许您列举
标记的技术:
Tagtag=celableExtra(_TAG);
四、创建常见NDEFRecords类型
本节介绍如何创建常见的NDEFRecords类型,以帮助您写入NFC标签或通
过AndroidBeaming机制发送数据。它还介绍了如何为record建立相应的意向筛
选器。所有的NDEFMessage里的第一个NEDFrecord的类型用来发送tag到一
个android设备上的activity。
TNF_ABSOLUTE_URI
鉴于以下TNF_ABSOLUTE_URINDEFrecord,作为一个NdefMessage内
的第一条记录存储:
。。。。。。
TNF_MIME_MEDIA
TNF_WELL_KNOWNwithRTD_TEXT
TNF_WELL_KNOWNwithRTD_URI
TNF_EXTERNAL_TYPE
Android应用记录
推出的Android4.0(API14级),Android应用记录(AAR)提供了一个更
强有力的功能,即扫描到一个NFC标签便启动应用程序。一个AAR带有一个
应用程序的包名,AAR内嵌在NDEF记录里。你可以添加一个AAR至您的NDE
消息的任意NDEF记录中,因为Android为AARs搜索全部的NDEF消息。如果
它找到一个AAR,它根据AAR内的包名来启动应用程序。如果设备上没有该应
用程序,推出GooglePlay下载该应用程序。
如果你想防止其他应用程序筛选相同的意向和可能处理特定的您部署的标
签,AARS是非常有用的。因为包名的约束,既不在Activity级也不是在意向筛
选,只在应用程序级AARs才被支持。如果你想处理一个Activity级的意向,使
用意向筛选器。
如果一个标签包含一个AAR,标签发布系统以下列方式发布:
通常使用意向筛选器尝试启动一个Activity。如果这个Activity既匹配意向,
也匹配AAR,则启动该Activity。
如果这个Activity,与AAR不匹配,如果有多个Activity可以处理该意向,
或如果没有Activity处理该意向,通过AAR启动指定的应用程序。
如果不能通过AAR启动应用程序,推出AndroidMarket下载基于AAR的
应用程序。
注意:您可以重写与前景调度系统,该系统允许前台活动有NFC标签被发
现时的优先奥尔斯和意向调度系统。用这种方法,活动必须是前景覆盖AARS
和意向调度系统。
如果你仍然要筛选扫描不包含AAR的标签,通常可以声明意向筛选器。如
果你的应用程序对其他不包含AAR的标签感兴趣,这是非常有用的。例如,也
许你要保证你的应用程序处理的你部署的专有标签,以及第三方部署的通用标签。
请记住,在Android4.0或以后版本的设备上,ARRs是具体的明确的。因此部署
标签的时候,你最有可能要使用ARRs和MIME类型/URI的组合,以支持最广
泛的设备。此外,当您部署NFC标签,想想你该如何写你的NFC标签,以获得
大多数设备(Android-power和其他设备)的支持。你可以通过定义一个相对独
特的MIME类型或URI,使应用程序更容易区分。
Android提供了一个简单的API来创建一个AAR,createApplicationRecord
()。所有你需要做的是在您的NdefMessage的任何地方嵌入AAR。除非AAR
是在NdefMessage的的唯一记录,否则你不要使用您NdefMessage的第一条记录。
这是因为Android系统,检查一个NdefMessage的第一条记录,以确定标签的
MIME类型或URI,这是用来创建一个应用程序的意向以便筛选。下面的代码演
示如何创建一个AAR:
NdefMessagemsg=newNdefMessage(
newNdefRecord[]{
...,
ApplicationRecord("")}
五、发送NDEF消息至其他设备
AndroidBeaming机制允许两款Android-power设备之间简单的点对点数据
交换。想要发送数据到另一个设备的应用程序必须在前台,并且接收数据的设备
不能被锁定。当发送设备与接收设备足够接近,发送设备显示“接触以发送”的
用户界面。然后,用户可以选择是否发送消息至接收设备。
注意:前台NDEF推送在API10级可用,它提供了与AndroidBeaming机
制类似的功能。因为这些API已经被废弃,但可支持旧设备。更多信息,请参
阅enableForegroundNdefPush()。
通过调用以下两种方法之一,你可以为应用程序使用AndroidBeaming机制:
•tNdefPushMessage():接收一个NdefMessage,把它设置为消息来发送。
当两个设备足够接近的时候,自动发送。
•tNdefPushMessageCallback():接受一个回调,它包含1个
createNdefMessage(),它被唤起,当在一定范围内的设备被称为一个回调。在
需要时,回调可以让你创建NDEF消息。
一个Activity一次只能推送一条NDEF消息,所以,如果在都设置的情况下,
tNdefPushMessageCallback()优先超过了tNdefPushMessage()。使用Android
Beaming机制,必须满足以下一般原则:
•发送数据的activity必须在前台。两台设备都必须未被锁定。
•您必须将要发送的数据封装在一个NdefMessage对象里。
•接收数据的NFC设备必须支持F的推送协议或NFC
论坛的SNEP(简单NDEF交换协议)。协议要求设备是API9
级(Android2.3)至API13级(Android3.2)。和SNEP都要
求API14级(Android4.0)及更高版本。
注意:如果您的活动,开启了AndroidBeaming机制并在前台,那么标准的
意向发布系统将被禁用。不过,如果你的活动开启了前台发送,那么它仍然可以
扫描标签,来匹配在前台发布系统中设置的意向筛选器。
开启AndroidBeaming机制:
1.创建一个NdefMessage,包含你将要发送到其他设备的NdefRecords。
2.*
##与NdefMessage或在onCreate()方法在您的活动
NdefMessageCallback对象调用
tNdefPushMessageCallback通过tNdefPushMessage()。这些
方法都需要至少有一个活动要连同其他活动的可选列表,激活,使与
Android梁。
在一般情况下,你通常使用tNdefPushMessage的()如果您的活动只
需要在任何时候都推相同NDEF消息,当两个设备在沟通范围。您可以
使用tNdefPushMessageCallback,当您的应用程序关心的应用程序的
当前背景下,要,推动NDEF消息取决于用户在您的应用程序做。
##*
下面的示例展示了,一个简单的活动如何在onCreate()中调用
NdefMessageCallback的方法(见完整范例AndroidBeamDemo)。
这个例子也可以帮助你创建一个MIME记录:
请注意,此代码注释出一个AAR,你可以删除该部分。如果您启用了AAR,
在AAR指定的应用程序总是收到AndroidBeaming机制的消息。如果应用程序
是不存在的,Android市场开始下载应用程序。因此,如果使用ARR,下面的意
向筛选器对于Android4.0设备或更高版本,不是必要的:
利用这个意向筛选器,现在可以启动应用,当它
扫描一个NFC标签或接收一个带有类型AAR的
AndroidBeaming,或者一个NDEF格式的消息包含一个
application/类型的MIME纪录。
即使AARS确保启动或下载一个应用程序,意向筛选器还是建议使用的,
因为他们让你启动你所选择的应用程序中的活动,而不是总是启动AAR指定包
的主要活动。ARRs没有活动级别之分。此外,因为一些Android-power设备不
支持AARS,你也应该在NDEF消息的第一个NDEF记录和筛选器中嵌入识别
信息,以防万一。更多关于如何创建记录的信息记录,请参阅创建常见类型NDEF。
本文发布于:2023-03-16 08:43:43,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/7fa6eee634982a636cc64b0a4c3886b9.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:nfc应用.doc
本文 PDF 下载地址:nfc应用.pdf
留言与评论(共有 0 条评论) |