目录:
近场通讯 (Near Filed Communication) 技术是一种近距离的高频无线通信技术, 通常距离是4 厘米或更短。 NFC 工作频率是 13.56M Hz, 传输速率是 106kbit/s 到 848kbit/s. NFC 总是在一个发起者和一个被动目标之间发生。发起者发出近场无线电波,这个近场可以给被动目标供电。这些被动的目标包括不需要电源的标签,卡,也可以是有电源的设备。
与其他无线通信技术比较, 例如蓝牙和 WiFi , NFC 提供更低贷款和距离,并且低成本,不需要供电,不需要实现匹配,整个通信过程仅仅是短短的靠近一秒就能完成。
Android 在Android 2.3(API Level 9) 中首次增加了对NFC 的支持,但是只能读取tag ,有很多不完善的地方。在Level 10 中增加了对tag 的写,不过构造和解析消息都是需要自己来处理。
后来的Android 4.0 ICS(API Level 14) 中全面提升了NFC 的功能,支持两台NFC 手机的相互通信,并且封装了方便的消息构造和解析接口。
Android 提供了三种级别的NFC 消息:
Ø android.nfc.action.NDEF_DISCOVERED : 由应用程序构造的NDEF (NFC Data Exchange Format :NFC 数据交换格式)消息。
Ø android.nfc.action.TECH_DISCOVERED : 现有的标准NFC 协议构造的消息。
Ø android.nfc.action.TAG_DISCOVERED :不符合前面两种格式的消息。
首先应用程序向系统注册感兴趣的Intent ,当系统的NFC 服务收到一条tag 之后,会打开合适的应用并传递Intent 。如果同时有N 个应用都对这个tag 感兴趣,并且都不在前台,则系统会弹出选择列表让用户选择,如果其中某个应用在前台,则系统直接将Intent 投递到此应用。具体如何注册见后面的用法。
首先,必须在manifest 中申明NFC 的权限和feature :
< uses-permission android:name = "android.permission.NFC" />
< uses-feature android:name = "android.hardware.nfc" />
如果应用必须拥有NFC 的手机才能安装,则在 uses-feature 中加上属性 android:required = "true" , 方便marekt 过滤。
然后注册感兴趣的Intent 。
u NDEF 格式的消息 :
这里的data 指定了感兴趣的数据类型和格式,系统会自动过滤出符合条件的Intent 。上面这个data 表示只接受纯文本的数据。如果只接受 http://www.qq.com 这个网址,则data 定义如下:
注意,这个类型 < category android:name = "android.intent.category.DEFAULT" /> 要加上。
u TECH 格式的消息 :
meta-data 中的resource 指定了对使用了哪些技术的tag 感兴趣。filter_nfc.xml 的内容如下:
这里是将所有的tech 标准都放到里面了,实际使用的时候不应如此,应该取一个或多个子集。这里关于tech 列表的子集定义还有一些规范,网上可以查到,就不赘述。
u TAG 格式的消息 :
如此,则所有没有被捕获的Intent 就会发送到这里来,算是各种未知NFC 数据的集散地。
Tag 分发系统流程图如下:
首先取得一个NFCAdapter ,一般是使用默认的:
三个发送消息相关的API :
Ø public void setNdefPushMessage (NdefMessage message, Activity activity, Activity... activities)
设置NDEF 消息。API 文档上说这个方法设置之后不需要让用户操作,设备靠近会自行发出,但是经过尝试发现不行,也许是有什么没注意到的地方。
Ø public void setNdefPushMessageCallback (NfcAdapter.CreateNdefMessageCallback callback, Activity activity, Activity... activities)
设置NDEF 消息的构造器,每次构造消息都会调用callback 的createNdefMessage 方法获取NDEF 消息。
Ø public void setOnNdefPushCompleteCallback (NfcAdapter.OnNdefPushCompleteCallback callback, Activity activity, Activity... activities)
设置NDEF 消息发送完毕之后的回调接口。
一个NdefMessage 对象是由N 个NdefRecord 组成,NdefRecord 可以根据自己的需要去定义里面的内容,不过如果要构造公共的标准NdefRecord ,就需要查阅API 文档了。
简单的用法如下: