移动应用开发结课论文
在移动平台开发的课上,老师给了我们一份源码(其实是让我们自己写出来,她是为了给我们参考的哈哈哈),让我们添加她要求的功能,按照博主尿性这次博客肯定就不会介绍这个应用的开发了,我会把结课的论文发上来。
Android系统中NFC应用的开发
孙黎楠
摘 要: 近场通信(英语:Near Field Communication,NFC),又称近距离无线通信,是一种短距离的高频无线通信技术,允许电子设备之间进行非接触式点对点数据传输,在十厘米(3.9英寸)内交换数据。而Android系统支持对关于NFC应用的开发。
关键词: Android; NFC; 支持开发
1 NFC介绍
近场通信(英语:Near Field Communication,NFC),又称近距离无线通信,是一种短距离的高频无线通信技术,允许电子设备之间进行非接触式点对点数据传输,在十厘米(3.9英寸)内交换数据。
这个技术由非接触式射频识别(RFID)演变而来,由飞利浦半导体(现恩智浦半导体)、诺基亚和索尼共同研制开发,其基础是RFID及互连技术。近场通信是一种短距高频的无线电技术,在13.56MHz频率运行于20厘米距离内。其传输速度有106 Kbit/秒、212 Kbit/秒或者424 Kbit/秒三种。目前近场通信已通过成为ISO/IEC IS 18092国际标准、EMCA-340标准与ETSI TS 102 190标准。NFC采用主动和被动两种读取模式。
现在,NFC工作模式主要有三种:
卡模拟模式(Card emulation mode):这个模式其实就是相当于一张采用RFID技术的IC卡。[来源请求]可以替代现在大量的IC卡(包括信用卡)场合商场刷卡、悠游卡、门禁管制、车票、门票等等。此种方式下,有一个极大的优点,那就是卡片通过非接触读卡器的RF域来供电,即便是寄主设备(如手机)没电也可以工作。NFC设备若要进行卡片模拟(Card Emulation)相关应用,则必须内置安全组件(Security Element, SE)之NFC芯片;
点对点模式(P2P mode):这个模式和红外线差不多,可用于数据交换,只是传输距离较短,传输创建速度较快,传输速度也快些,功耗低(蓝牙也类似)。将两个具备NFC功能的设备链接,能实现数据点对点传输,如下载音乐、交换图片或者同步设备地址薄。因此通过NFC,多个设备如数位相机、PDA、计算机和手机之间都可以交换资料或者服务;
读卡器模式(Reader/Writer mode):作为非接触读卡器使用,比如从海报或者展览信息电子标签上读取相关信息。
2 API概览
1.Android.nfc package包含顶层类用来与本地NFC适配器交互. 这些类可以表示被检测到的tags和用NDEF数据格式。
类 |
描述 |
一个NFC adapter的管理器,可以列出所有此android设备支持的NFC adapter. 只不过大部分android 设备只有一个NFC adapter,所以你大部分情况下可以直接用静态方法 getDefaultAdapter(context)来取适配器。 |
|
表示本设备的NFC adapter,可以定义Intent来请求将系统检测到tags的提醒发送到你的Activity.并提供方法去注册前台tag提醒发布和前台NDEF推送。 前台NDEF推送是当前android版本唯一支持的p2p NFC通信方式。 |
|
And |
NDEF是NFC论坛定义的数据结构,用来有效的存数据到NFC tags.比如文本,URL,和其他MIME类型。 一个NdefMessage扮演一个容器,这个容器存哪些发送和读到的数据。一个NdefMessage对象包含0或多个NdefRecord,每个NdefRecord有一个类型,比如文本,URL,智慧型海报/广告,或其他MIME数据。 在NdefMessage里的第一个NfcRecord的类型用来发送tag到一个android设备上的activity. |
标示一个被动的NFC目标,比如tag,card,钥匙挂扣,甚至是一个电话模拟的的NFC卡. 当一个tag被检测到,一个tag对象将被创建并且封装到一个Intent里,然后NFC 发布系统将这个Intent用startActivity发送到注册了接受这种Intent的activity里。你可以用getTechList()方法来得到这个tag支持的技术细节和创建一个android.nfc.tech提供的相应的TagTechnology对象。 |
2.android.nfc.tech package 包含那些对tag查询属性和进行I/O操作的类。这些类分别标示一个tag支持的不同的NFC技术标准。
类 |
描述 |
这个接口是下面所有tag technology类必须实现的。 |
|
支持ISO 14443-3A 标准的操作。Provides access to NFC-A (ISO 14443-3A) properties and I/O operations. |
|
Provides access to NFC-B (ISO 14443-3B) properties and I/O operations. |
|
Provides access to NFC-F (JIS 6319-4) properties and I/O operations. |
|
Provides access to NFC-V (ISO 15693) properties and I/O operations. |
|
Provides access to ISO-DEP (ISO 14443-4) properties and I/O operations. |
|
提供对那些被格式化为NDEF的tag的数据的访问和其他操作。 Provides access to NDEF data and operations on NFC tags that have been formatted as NDEF. |
|
对那些可以被格式化成NDEF格式的tag提供一个格式化的操作 |
|
如果android设备支持MIFARE,提供对MIFARE Classic目标的属性和I/O操作。 |
|
如果android设备支持MIFARE,提供对MIFARE Ultralight目标的属性和I/O操作。 |
3 NFC标签调度系统
通常,除非是在设备的设置菜单中NFC被禁用,否则Android设备会在非锁屏的状态下搜索NFC。当Android设备发现NFC标签时,期望的行为是用最合适的Activity来处理该Intent,而不是询问用户使用什么应用程序。因为设备只能在很短的范围内扫描到NFC标签,强制的让用户手动的选择一个Activity,会导致设备离开NFC标签,从而中断该连接。因此,在自己开发activity时应注意阻止选择器的操作。Android提供了特殊的标签调度系统,来分析扫描到的NFC标签,通过解析数据,在被扫描到的数据中尝试找到感兴趣的应用程序,具体做法如下:
1.解析NFC标签并搞清楚标签中标识数据负载的MIME类型或URI;
2.把MIME类型或URI以及数据负载封装到一个Intent中。
3.基于Intent来启动Activity。
3.1 怎样把NFC标签映射到MIME类型和URI
当Android设备扫描到包含NDEF格式数据的NFC标签时,它会解析该消息,并尝试搞清楚数据的MIME类型或URI标识。首先系统会读取消息(NdefMessage)中的第一条NdefRecord,来判断如何解释整个NDEF消息(一个NDEF消息能够有多条NDEF记录)。 在格式良好的NDEF消息中,第一条NdefRecord包含以下字段信息:
1)3-bit TNF(类型名称格式) 指示如何解释可变长度类型字段,在下表1中介绍有效值。
2)可变长度类型 说明记录的类型,如果使用TNF_WELL_KNOWN,那么则使用这个字段来指定记录的类型定义(RTD)。在下表2中定义了有效的RTD值。
3)可变长度ID 唯一标识该记录。这个字段不经常使用,但是,如果需要唯一的标识一个标记,那么就可以为该字段创建一个ID。
4)可变长度负载 你想读/写的实际的数据负载。一个NDEF消息能够包含多个NDEF记录,因此不要以为在NDEF消息的第一条NDEF记录中包含了所有的负载。
标签调度系统使用TNF和类型字段来尝试把MIME类型或URI映射到NDEF消息中。如果成功,它会把信息跟实际的负载一起封装到ACTION_NEDF_DISCOVERED类型的Intent中。但是,会有标签调度系统不能根据第一条NDEF记录来判断数据类型的情况,这样就会有NDEF数据不能被映射到MIME类型或URI,或者是NFC标签没有包含NDEF开始数据的情况发生。在这种情况下,就会用一个标签技术信息相关的Tag对象和封装在ACTION_TECH_DISCOVERED类型Intent对象内部的负载来代替。
3.2 应用程序如何调度NFC标签
当标签调度系统完成对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相比,它会允许在更加合适的时机来启动应用程序,从而给用户带来更好的体验。
4 在Android的Manifest中申请NFC访问
在访问设备的NFC硬件和正确的处理NFC的Intent之前,要在AndroidManifest.xml文件中进行以下声明:
1. 在<uses-permission>元素中声明访问NFC硬件:
<uses-permission android:name="android.permission.NFC" />
2. 取决于应用程序所支持的最小的SDK版本。API Level 9只通过ACTION_TAG_DISCOVERED来支持有限的标签调度,并且只能通过EXTRA_NDEF_MESSAGES来访问NDEF消息。没有其他的标签属性或I/O操作可用。API Level 10中包含了广泛的读写支持,从而更好的推动了NDEF的应用前景,并且API Leve 14用Android Beam和额外的方便的创建NDEF记录的方法,向外提供了更容易的把NDEF消息推送给其他设备的方法。
<uses-sdk android:minSdkVersion="10"/>
3. 使用uses-feature元素,在Google Play中,以便应用程序能够只针对有NFC硬件的设备来显示。
<uses-feature android:name="android.hardware.nfc" android:required="true"/>
如果应用程序使用了NFC功能,但是相关的功能又不是应用程序的关键功能,则可以忽略uses-feature元素,并且要在运行时通过调用getDefaultAdapter()方法来检查NFC是否有效
5 过滤NFC的Intent
要在想要处理被扫描到的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的情况下,才使用的最后手段。
6 把NDEF消息发射到其他设备上
Android Beam允许在两个Android设备之间进行简单的对等数据交换,想要把数据发送给另一个设备的应用程序必须是在前台,并且接收数据的设备必须不被锁定。当发射设备跟接收设备的距离足够近的时候,发射设备会显示“Touch to Beam(触摸发射)”的UI。然后,用户能够选择是否把消息发射给接收设备。
通过调用下列两个方法中的任意一个,就能够为应用程序启用Android Beam:
1. setNdefPushMessage():这个方法把接收到的NdefMessage对象作为一个消息设置给Beam。当两个设备足够近的时候,就会自动的发送消息。
2. setNdefPushMessageCallback():接收包含createNdefMessage()方法的回调,当设备在发射数据的范围内时,这个回调方法会被调用。回调会让你只在需要的时候创建NDEF消息。
一个Activity一次只能推送一条NDEF消息,因此如果同时使用了这两种方法,那么setNdefPushMessageCallback()方法的优先级要高于setNdefPushMessage()方法。要使用Android Beam,通常必须满足以下条件:
1. 发射数据的Activity必须是在前台。两个设备的屏幕都必须没有被锁定;
2. 必须发要发射的数据封装到一个NdefMessage对象中;
3. 接收发射数据的NFC设备必须支持com.android.npp NDEF推送协议或是NFC组织的SNEP协议(简单的NDEF交换协议)。在API Level9(Android2.3)到API Level 13(Android3.2)的设备上需要com.android.npp协议。在API Level 14(Android4.0)和以后的设备上,com.android.npp和SNEP都需要。
注意:如果在前台的Activity启用了Android Beam,那么标准的Intent调度系统就会被禁用。但是,如果该Activity还启用了前台调度,那么在前台调度系统中,它依然能够扫描到跟Intent过滤器匹配的NFC标签。
7 论文总结
本文通过参考资料,向读者详细介绍了目前在安卓系统的智能手机乃至windows Phone上应用广泛的NFC的开发方法,对于像论文作者一样的初学者来说这方面的知识并不简单,但是希望大家能像作者一样,在看完这篇论文后能学到更多的知识.
参考文献:
[1] 维基百科Wikipedia,自由的百科全书,近场通信词条.
[2] 安卓上NFC应用开发介绍.
[3] 《深入Android应用开发:核心技术解析与最佳实践》,苗忠良、曾旭、宛斌著,第一版,机械工业出版社.