官方文档:https://developer.android.google.cn/guide/topics/connectivity/nfc/nfc.html
前言:NFC(Near Field Communication 近场通讯),它是前几年逐渐起来的一种技术,出来之后,感觉一直不温不火的样子。直到最近有个朋友需要手机与nfc标签读写信息,让我帮忙,所以才了解这门技术,下面我们一起来了解并学习一下。
一、近场通讯
大家都知道android近场通讯包括我们最熟知的wifi,蓝牙,还有已经慢慢消失的红外,最后就是我们今天的主角nfc了,nfc与其他通信类型不同的是要求距离不能超过4cm(不同的nfc标签略有差别),查看官方文档,我们知道nfc通信的模式有一下三种:
读卡器模式(Reader/Writer Mode)
仿真卡模式(Card Emulation Mode)
点对点模式(P2P Mode)
二、nfc标签
今天主要讲的是读写模式,在开始写代码之前,有必要了解nfc的标签调度系统,标签调度系统如何解析NFC标签和特殊的工作,当它检测到NDEF消息的标记调度系统一样。NFC标签来在广泛的技术和还可以有许多不同的方式写入到其中的数据。机器人具有用于NDEF标准NDEF数据被封装的消息(内部NdefMessage),其中包含一个或多个记录(NdefRecord)。每个NDEF记录必须根据您要创建的记录类型的规格良好的。Android版 还支持其它类型的标签不包含NDEF的数据,您可以通过在使用类的工作android.nfc.tech包。要了解更多有关这些技术,请参阅高级NFC主题。这些其他类型的标签工作包括编写你自己的协议栈与标签进行通信,因此,我们建议使用NDEF在可能的情况,便于开发和最大支持Android的供电设备。
现在,你有NFC标签的背景,下面的章节详细描述了Android的如何处理NDEF格式化的标签。
当一个Android设备扫描包含NDEF格式的数据的NFC标签,它解析该消息并试图找出数据的MIME类型或标识的URI。要做到这一点,系统读取所述第一[NdefRecord(https://developer.android.google.cn/reference/android/nfc/NdefRecord.html)
内部的[NdefMessage](https://developer.android.google.cn/reference/android/nfc/NdefMessage.html),以确定如何解释整个NDEF消息(一个NDEF消息可以有多个NDEF记录)。
在一个结构良好的NDEF消息,第一个[NdefRecord(https://developer.android.google.cn/reference/android/nfc/NdefRecord.html)
包含以下字段:
3-bit TNF (Type Name Format) :指示如何解释可变长度类型字段
![0HF]EHB8]IQN5AC1BFIAY3M.png](http://upload-images.jianshu.io/upload_images/3287039-406ac40629b31ff6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
Variable length type:描述了记录的类型。如果使用TNF_WELL_KNOWN,使用此字段指定记录类型定义(RTD)
Variable length payload:要读取或写入的实际数据的有效载荷。一个NDEF消息可以包含多个NDEF记录,所以不承担全部有效载荷在NDEF消息的第一NDEF纪录。
三:nfc分发
说了这么多,Android系统是怎么检测到nfc靠近并通知相应的应用程序呢?其实就是用的Intent Filter,当我们在AndroidManifest.xml的activity中注册了相应的nfc intent后,当有相应的action来临时,系统就会把nfc分发到该App中,如果有多个App符合要求,则系统会弹出对话框让用户选择。标签调度系统定义了三个意图,优先级从高到低如下:
1.ACTION_NDEF_DISCOVERED:
本意图是用来启动一个活动时,它包含一个NDEF净荷标签的扫描和是一个公认的类型。
这是最高优先级的意图,并且标签调度系统尝试尽可能任何其他意图,之前启动这一意图的活动。
2.ACTION_TECH_DISCOVERED:
如果没有App注册过ACTION_NDEF_DISCOVERED,标签调度系统试图启动与此意向的应用程序。此意向也直接启动(不启动ACTION_NDEF_DISCOVERED在前),如果被扫描的标签包含无法映射到MIME类型或URI,或者如果标签不包含NDEF数据,但是是一个已知的标签技术NDEF数据。
3.ACTION_TAG_DISCOVERED:
如果没有活动处理这一意图已启动ACTION_NDEF_DISCOVERED或ACTION_TECH_DISCOVERED意图。
标签调度系统工作的基本方法如下:
1.尝试启动与由标签调度系统解析NFC标签时(无论是创建一个意图活动ACTION_NDEF_DISCOVERED或ACTION_TECH_DISCOVERED)。
2.如果这一意图没有活动过滤器,尝试下一个优先级最低的意图(无论是启动一个活动ACTION_TECH_DISCOVERED或ACTION_TAG_DISCOVERED,直到意图或直至标签调度系统中的应用程序过滤器尝试所有可能的目的。
3.如果没有应用程序筛选任何意图的,什么也不做。
只要有可能,以NDEF消息和工作ACTION_NDEF_DISCOVERED的意图,因为它是最特定出的三个。
此意向,您可以在比其他两个意图更适当的时间启动应用程序,给用户更好的体验。