正文  网络通信 > 近场通信/NFC >

Android NFC android开发教程

Android所支持的NFC操作有三种模式: 1.Reader/Writer Mode:允许NFC设备读写一个NFC Tag或者Sticker         2.P2P Mode:允...

Android所支持的NFC操作有三种模式:
 
1.Reader/Writer Mode:允许NFC设备读写一个NFC Tag或者Sticker
 
        2.P2P Mode:允许NFC设备与另外一台NFC设备交换数据,这种模式已经用于Android Beam中了
 
            3.Card Emulation Mode:允许NFC设备自己作为一个NFC卡,作为一个拓展的NFC Reader。
 
 
 
    使用NDEF数据的话主要有两种情况:
 
    1.从一个NFC Tag中读取NDEF数据
 
    2.发送一个NDEF数据到另外一台设备上,通过Android Beam的方式。
 
 
 
         通过Tag Dispatch System,可以从NFC Tag中读取NDEF数据,当解析NFC Tag的时候,我们可以通过生命一个Intent-filter,来表明我们所感兴趣的特定的数据,并且Android会启动这个应用程序并且传递数据给它。
 
         Android Beam特性允许一台设备push一个NDEF消息通过物理碰撞到另外一个设备上,而只要当手机处于解锁状态下时,Tag Dispatch System就会运行的,除非把NFC功能关掉了。
 
         当Tag Dispatch System检测到了Tag碰撞的时候,就会启动最符合该Tag标准的Activity,由于设备发现搜索的NFC Tag会在一个很短的距离内,所以尽量只选择自己感兴趣的Tag进行处理,而不会导致让用户选择Activity。
 
         以下为官网文档的原话:
 
Because devices scan NFC tags at a very short range, it is likely that making users manually select an activity would force them to move the device away from the tag and break the connection. You should develop your activity to only handle the NFC tags that your activity cares about to prevent the Activity Chooser from appearing.
 
 
 
         为了让用户尽可能不通过Activity Chooser进行选择,Android 通过以下方式来定位最合适的Application:
 
         1.解析一个NFC Tag并且parse出Data payload中能够被唯一标识的MIME Type以及URI来决定这个Tag。
 
         2.将解析出来的MIME Type与URI以及Data payload放入一个Intent对象中。
 
         3.基于这个Intent启动Activity。
 
 
 
        一个NDEFMessage中可能会包含很多个NDEFRecord,Android也支持其他的不包含NDEF数据的Tag,通过android.nfc.tech包可以找到。而与这些对应的NFC Tag Technology要有数据交互的话,就需要自己实现与他们通信的协议栈与其通信,所以Android建议尽量使用NDEF数据格式,因为更易于开发以及Android手机的支持。
 
 
 
Working with these other types of tags involves writing your own protocol stack to communicate with the tags, so we recommend using NDEF when possible for ease of development and maximum support for Android-powered devices。
 
 
 
        为了Parse出NDEF数据的URI和MIME Type,系统会读取第一个NdefRecord,而第一个NdefRecord属性为:
 
        1.3-bit TNF(Type Name Format):
 
              TNF_ABSOLUTE_URI:如果为此值的话,那么就说明有一个特定的URI。
 
              TNF_EMPTY:返回到ACTION_TECH_DISCOVERED
 
              TNF_EXTERNAL_TYPE:拓展的URI
 
              TNF_MIME_MEDIA:基于此类型的MIME TYPE
 
              TNF_UNCHANGED:返回到ACTION_TECH_DISCOVERED
 
              TNF_UNKNOWN:返回到ACTION_TECH_DISCOVERED
 
              TNF_WELL_KNOWN:已经有,但是需要比对RTD(Record Type Definition)来确定。
 
 
 
 
 
              对于TNF_WELL_KNOW这种类型的TNF的话,就需要来比较RTD来确定MIME TYPE以及URI了。