在移动平台开发的课上,老师给了我们一份源码(其实是让我们自己写出来,她是为了给我们参考的哈哈哈),让我们添加她要求的功能,按照博主尿性这次博客肯定就不会介绍这个应用的开发了,我会把结课的论文发上来。
Android系统中NFC应用的开发
孙黎楠
关键词:Android;NFC;支持开发
现在,NFC工作模式主要有三种:
点对点模式(P2Pmode):这个模式和红外线差不多,可用于数据交换,只是传输距离较短,传输创建速度较快,传输速度也快些,功耗低(蓝牙也类似)。将两个具备NFC功能的设备链接,能实现数据点对点传输,如下载音乐、交换图片或者同步设备地址薄。因此通过NFC,多个设备如数位相机、PDA、计算机和手机之间都可以交换资料或者服务;
1.Android.nfcpackage包含顶层类用来与本地NFC适配器交互.这些类可以表示被检测到的tags和用NDEF数据格式。
类
描述
一个NFCadapter的管理器,可以列出所有此android设备支持的NFCadapter.
只不过大部分android设备只有一个NFCadapter,所以你大部分情况下可以直接用静态方法getDefaultAdapter(context)来取适配器。
表示本设备的NFCadapter,可以定义Intent来请求将系统检测到tags的提醒发送到你的Activity.并提供方法去注册前台tag提醒发布和前台NDEF推送。
前台NDEF推送是当前android版本唯一支持的p2pNFC通信方式。
And
NDEF是NFC论坛定义的数据结构,用来有效的存数据到NFCtags.比如文本,URL,和其他MIME类型。
在NdefMessage里的第一个NfcRecord的类型用来发送tag到一个android设备上的activity.
当一个tag被检测到,一个tag对象将被创建并且封装到一个Intent里,然后NFC发布系统将这个Intent用startActivity发送到注册了接受这种Intent的activity里。你可以用getTechList()方法来得到这个tag支持的技术细节和创建一个android.nfc.tech提供的相应的TagTechnology对象。
这个接口是下面所有tagtechnology类必须实现的。
支持ISO14443-3A标准的操作。ProvidesaccesstoNFC-A(ISO14443-3A)propertiesandI/Ooperations.
ProvidesaccesstoNFC-B(ISO14443-3B)propertiesandI/Ooperations.
ProvidesaccesstoNFC-F(JIS6319-4)propertiesandI/Ooperations.
ProvidesaccesstoNFC-V(ISO15693)propertiesandI/Ooperations.
ProvidesaccesstoISO-DEP(ISO14443-4)propertiesandI/Ooperations.
提供对那些被格式化为NDEF的tag的数据的访问和其他操作。
ProvidesaccesstoNDEFdataandoperationsonNFCtagsthathavebeenformattedasNDEF.
对那些可以被格式化成NDEF格式的tag提供一个格式化的操作
如果android设备支持MIFARE,提供对MIFAREClassic目标的属性和I/O操作。
如果android设备支持MIFARE,提供对MIFAREUltralight目标的属性和I/O操作。
通常,除非是在设备的设置菜单中NFC被禁用,否则Android设备会在非锁屏的状态下搜索NFC当Android设备发现NFC标签时,期望的行为是用最合适的Activity来处理该Intent,而不是询问用户使用什么应用程序因为设备只能在很短的范围内扫描到NFC标签,强制的让用户手动的选择一个Activity,会导致设备离开NFC标签,从而中断该连接。因此,在自己开发activity时应注意阻止选择器的操作。Android提供了特殊的标签调度系统,来分析扫描到的NFC标签,通过解析数据,在被扫描到的数据中尝试找到感兴趣的应用程序,具体做法如下:
1.解析NFC标签并搞清楚标签中标识数据负载的MIME类型或URI;
2.把MIME类型或URI以及数据负载封装到一个Intent中
3.基于Intent来启动Activity。
当Android设备扫描到包含NDEF格式数据的NFC标签时,它会解析该消息,并尝试搞清楚数据的MIME类型或URI标识首先系统会读取消息(NdefMessage)中的第一条NdefRecord,来判断如何解释整个NDEF消息(一个NDEF消息能够有多条NDEF记录)在格式良好的NDEF消息中,第一条NdefRecord包含以下字段信息:
1)3-bitTNF(类型名称格式)指示如何解释可变长度类型字段,在下表1中介绍有效值
2)可变长度类型说明记录的类型,如果使用TNF_WELL_KNOWN,那么则使用这个字段来指定记录的类型定义(RTD)在下表2中定义了有效的RTD值
3)可变长度ID唯一标识该记录这个字段不经常使用,但是,如果需要唯一的标识一个标记,那么就可以为该字段创建一个ID
4)可变长度负载你想读/写的实际的数据负载一个NDEF消息能够包含多个NDEF记录,因此不要以为在NDEF消息的第一条NDEF记录中包含了所有的负载
当标签调度系统完成对NFC标签和它的标识信息封装的Intent对象的创建时,它会把该Intent对象发送给感兴趣的应用程序。如果有多个应用程序能够处理该Intent对象,就会显示Activity选择器,让用户选择Activity。标签调度系统定义了三种Intent对象,以下按照由高到低的优先级列出这三种Intent对象:
1.ACTION_NDEF_DISCOVERED:这种Intent用于启动包含NDEF负载和已知类型的标签的Activity。这是最高优先级的Intent,并且标签调度系统在任何其他Intent之前,都会尽可能的尝试使用这种类型的Intent来启动Activity。
2.ACTION_TECH_DISCOVERED:如果没有注册处理ACTION_NDEF_DISCOVERED类型的Intent的Activity,那么标签调度系统会尝试使用这种类型的Intent来启动应用程序。如果被扫描到的标签包含了不能被映射到MIME类型或URI的NDEF数据,或者没有包含NDEF数据,但是是已知的标签技术,那么也会直接启动这种类型的Intent对象(而不是先启动ACTION_NDEF_DISCOVERED类型的Intent)
3.ACTION_TAB_DISCOVERED:如果没有处理ACTION_NDEF_DISCOVERED或ACTION_TECH_DISCOVERED类型Intent的Activity,就会启动这种类型的Intent。
标签调度系统的基本工作方法如下:
1.用解析NFC标签时由标签调度系统创建的Intent对象(ACTION_NDEF_DISCOVERED或ACTION_TECH_DISCOVERED)来尝试启动Activity;
2.如果没有对应的处理Intent的Activity,那么就会尝试使用下一个优先级的Intent(ACTION_TECH_DISCOVERED或ACTION_TAG_DISCOVERED)来启动Activity,直到有对应的应用程序来处理这个Intent,或者是直到标签调度系统尝试了所有可能的Intent。
3.如果没有应用程序来处理任何类型的Intent,那么就不做任何事情。
在可能的情况下,都会使用NDEF消息和ACTION_NDEF_DISCOVERED类型的Intent来工作,因为它是这三种Intent中最标准的。这种Intent与其他两种Intent相比,它会允许在更加合适的时机来启动应用程序,从而给用户带来更好的体验。
2.取决于应用程序所支持的最小的SDK版本。APILevel9只通过ACTION_TAG_DISCOVERED来支持有限的标签调度,并且只能通过EXTRA_NDEF_MESSAGES来访问NDEF消息。没有其他的标签属性或I/O操作可用。APILevel10中包含了广泛的读写支持,从而更好的推动了NDEF的应用前景,并且APILeve14用AndroidBeam和额外的方便的创建NDEF记录的方法,向外提供了更容易的把NDEF消息推送给其他设备的方法。
3.使用uses-feature元素,在GooglePlay中,以便应用程序能够只针对有NFC硬件的设备来显示。
要在想要处理被扫描到的NFC标签时启动应用程序,可以在应用程序的Android清单中针对一种、两种或全部三种类型的NFC的Intent来过滤。
1.通常想要在应用程序启动时控制最常用的ACTION_NDEF_DISCOVERED类型的Intent。
2.在没有过滤ACTION_NDEF_DISCOVERED类型的Intent的应用程序,或数据负载不是NDEF时,才会从ACTION_NDEF_DISCOVERED类型的Intent回退到ACTION_TECH_DISCOVERED类型的Intent。
3.通常ACTION_TAB_DISCOVERED是最一般化的过滤分类。很多应用程序都会在过滤ACTION_TAG_DISCOVERED之前,过滤ACTION_NDEF_DISCOVERED或ACTION_TECH_DISCOVERED,这样就会降低应用程序被启动的可能性。ACTION_TAG_DISCOVERED只是在没有应用程序处理ACTION_NDEF_DISCOVERED或ACTION_TECH_DISCOVERED类型的Intent的情况下,才使用的最后手段。
AndroidBeam允许在两个Android设备之间进行简单的对等数据交换,想要把数据发送给另一个设备的应用程序必须是在前台,并且接收数据的设备必须不被锁定。当发射设备跟接收设备的距离足够近的时候,发射设备会显示“TouchtoBeam(触摸发射)”的UI。然后,用户能够选择是否把消息发射给接收设备。
通过调用下列两个方法中的任意一个,就能够为应用程序启用AndroidBeam:
1.setNdefPushMessage():这个方法把接收到的NdefMessage对象作为一个消息设置给Beam。当两个设备足够近的时候,就会自动的发送消息。
2.setNdefPushMessageCallback():接收包含createNdefMessage()方法的回调,当设备在发射数据的范围内时,这个回调方法会被调用。回调会让你只在需要的时候创建NDEF消息。
一个Activity一次只能推送一条NDEF消息,因此如果同时使用了这两种方法,那么setNdefPushMessageCallback()方法的优先级要高于setNdefPushMessage()方法。要使用AndroidBeam,通常必须满足以下条件:
1.发射数据的Activity必须是在前台。两个设备的屏幕都必须没有被锁定;
2.必须发要发射的数据封装到一个NdefMessage对象中;
3.接收发射数据的NFC设备必须支持com.android.nppNDEF推送协议或是NFC组织的SNEP协议(简单的NDEF交换协议)。在APILevel9(Android2.3)到APILevel13(Android3.2)的设备上需要com.android.npp协议。在APILevel14(Android4.0)和以后的设备上,com.android.npp和SNEP都需要。
注意:如果在前台的Activity启用了AndroidBeam,那么标准的Intent调度系统就会被禁用。但是,如果该Activity还启用了前台调度,那么在前台调度系统中,它依然能够扫描到跟Intent过滤器匹配的NFC标签。
本文通过参考资料,向读者详细介绍了目前在安卓系统的智能手机乃至windowsPhone上应用广泛的NFC的开发方法,对于像论文作者一样的初学者来说这方面的知识并不简单,但是希望大家能像作者一样,在看完这篇论文后能学到更多的知识.
参考文献:
[1]维基百科Wikipedia,自由的百科全书,近场通信词条.
[2]安卓上NFC应用开发介绍.
[3]《深入Android应用开发:核心技术解析与最佳实践》,苗忠良、曾旭、宛斌著,第一版,机械工业出版社.