在新版本的android中,近场通讯已经被支持。所谓近场通讯(NFC),又称近距离无线通信,是一种短距离的高频无线通信技术,允许电子设备之间进行 近距离的(10厘米)非接触式点对点传输,NFC由非接触式射频识别(RFID)及互联互通技术整合演变而来,实现了在单一芯片上结合感应式读卡器、感应 式卡片和点对点功能,能在短距离内与兼容设备进行设别和数据交换。NFC在最初仅仅是对RFID技术和网络技术的简单合并,但是在现在已经演变成为一种短 距离无线通信技术,发展态势相当迅速。

与RFID不同的是,NFC具有双向识别和连接的特点,工作于13.56MHz频率范围,NFC采取了独特的信号衰减技术,相对于RFID来说NFC具有距离近、带宽高、能耗低等特点。

NFC与蓝牙相比较,它不需要复杂设置程序,也可以简化蓝牙连接。NFC略胜蓝牙的地方在于设置程序较短,但是无法达到蓝牙的低功率。他的最大数据传输量 是424kbit/s远小于蓝牙v2.1的2.1Mbit/s。虽然NFC在传输速度与距离比不上蓝牙,但是由于NFC技术不需要电源,对于移动电话和消 费性电子产品来说,这种技术的使用比较方便。它的短距离通信特征正是其优点,由于耗电量低、一次只和一台机器连接,因此其拥有较高的保密性与安全 性,NFC有利于信用卡交易时避免被盗用。NFC的目标并非是取代蓝牙等其他无线技术,而是在不同的场合、不同的领域起到相互补充的作用。


不过虽然Android系统已经提供了关于RFC的API,但是跟蓝牙和wifi一样,它必须有硬件的支持。在实际硬件的支持上面,现在的情况还不是很普 及,前些日子有新闻称google将在纽约和旧金山测试NFC支付,而iPhone 5据说还是不会集成NFC的功能,Android方面,google早在Nexus S上就已经内置了NFC。

NFC通信总是涉及了一个发起设备和一个目标设备,可以理解为一个阅读器和一个标签设备,阅读器可以产生一个射频场用来给一个标签提供电源,正是这个类似 于RFID的特性使得一个NFC的标签设备可以做成是一个简单的标签、卡片的无源的形式。另外,当通信的双方都开启了阅读器的情况下,也可以通过RFC建 立起点到点的通信。

一个拥有NFC硬件支持的Android设备典型的设置是在屏幕未锁的状态下工作在NFC通信的发起设备模式,这个模式就是通常所说的标签读写器。工作在 这个模式下的Android设备将会主动的去搜寻有效范围内的NFC标签,并且在适当的时候对这些搜寻到的标签进行处理工作。Android 2.3.3版本下还加入了少量的对NFC的P2P方面的支持。

NFC的标签有很多种不同的种类,包括了各种复杂程度,随着复杂程度的不同,它们所存储的信息量及种类也有所不同,例如某些简单的标签仅仅提供了供读写的 语义,并且只提供了小块一次性写入的只读存储;而一些稍微复杂一点的标签还提供了一些数学运算的功能,支持加密从而可以进行身份验证功能;最复杂的标签上 面还可以包括操作环境,允许在标签上面执行代码并且进行复杂的交互。

下一次开始具体学习Android为NFC提供的API。

Android NFC API概述

Android中提供的与NFC相关的较高层的类都包含在android.nfc中,这个包中包含了用于与本地NFC适配器交互的类,用于代表已经识别的标签的类以及用来使用NDEF(Nfc Data Exchange Format )格式的类。

这个包中主要包括了如下几个类:

Show entries
Search: 
类名 描述
NfcManager NFC的一个高级管理类,用于枚举出本机的NFC适配器。由于大多数的设备都只提供一个NFC适配器,因此在大多数情况下我们可以通过getDefaultAdapter(Context)这个静态的方法来得到本地的NFC适配器的引用。
NfcAdapter 该类代表了本地的NFC适配器。它定义了如何将NFC标签的信息传达给Activity的intent,并且提供了用于注册前台标签调度和前台的数据推送的方法。前台的基于NDEF的数据推送是目前Android仅提供的点到点支持方式。
NdefMessage and NdefRecord NDEF是由NFC 论坛所定义的一种数据结构,它是为了高效率的在NFC标签上存储数据,例如文本、url或者其他的数据格式。NdefMessage是用于封装需要传输或 读取的数据的容器。而每一个NdefMessage包含了0个或若干个NdefRecord。每个NDEF的记录都包括一种有效类型的数据。在一条 NDEF消息中的第一个记录的作用是向android的Activity调度一个标签。
Tag 该类代表了一个无源的NFC标签。这种标签可以来自于各种物体,比如通常所用的物理标签、卡片、钥匙卡或者也 可以是一部可以仿真成NFC标签的电话机。当NFC识别设备发现了一个NFC标签,系统就会创建一个NFC Tag对象并在对象中封装一个intent。然后NFC的标签调度系统将会负责将这些intent调度到适当的Activity中。可以通 过 getTechList() 方法来决定使用适合该Tag对象的读写标准并且可以使用 android.nfc.tech包所提供的相关类来创建与此 相关的 TagTechnology 对象。
Showing 1 to 4 of 4 entries

 

Android.nfc.tech包主要是包括了一些用于查询特定标签的特性和I/O操作的类。所有的这些类都需要实现TagTechnology接口, 它们包括NfcA、NfcB、NfcF、NfcV、IsoDep、Ndef、NdefFormtable、MifareClassic、 MifareUltralight这几个类。

Android与NFC相关的类大致就是如上几个,下面我们简单的了解一下如何开始NFC的编程。

根据Android系统所遵循的权限机制,我们需要在AndroidManifest.xml中对需要使用的权限进行声明,这样在程序进行安装时将会提示 用户该程序将会使用到哪些设备,让用户来决定是否赋予应用程序相应的权限,Android通过这样的机制来提高系统的安全性。因此当我们在应用程序中需要 使用到NFC硬件的时候,我们应当在AndroidManifest.xml中加上:

1
<uses-permission android:name="android.permission.NFC" />

另外还需要声明的是能够支持应用程序的最低SDK版本,由于对NFC的支持是在API 10以后才比较完善,因此我们需要使用:

1
<uses-sdk android:minSdkVersion="10"/>

android的应用程序都是通过上传到Android Market上供用户下载的,我们可以通过加入如下一段声明使我们的应用程序能够被归类到“支持NFC”的手机型号中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<uses-feature android:name="android.hardware.nfc" android:required="true" />1
<p style="text-indent: 2em;">最后,我们可以通过声明一些intent filter来告诉操作系统该Activity可以处理NFC数据,有三种声明的方式:
1        <intent-filter>
      <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
      <data android:mimeType="mime/type" />
    </intent-filter>
 
        <intent-filter>
      <action android:name="android.nfc.action.TECH_DISCOVERED"/>
      <meta-data android:name="android.nfc.action.TECH_DISCOVERED"
           android:resource="@xml/nfc_tech_filter.xml" />
    </intent-filter>
 
    <intent-filter>
      <action android:name="android.nfc.action.TAG_DISCOVERED"/>
    </intent-filter>

这三种intent filter的声明方式使用在特定的情况下。因此我们需要通过分析具体的应用程序来决定使用哪一种方式。具体怎么选择将在后面提到(标签调度系统)。

这里我们可以看一看一个完整的AndroidManifest.xml例子,取自于NFCDemo。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?xml version="1.0" encoding="utf-8"?>
    package="com.example.android.nfc"
>
    <uses-permission android:name="android.permission.NFC" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <application
        android:icon="@drawable/icon"
        android:label="@string/app_name"
    >
    <activity android:name=".simulator.FakeTagsActivity"
        android:theme="@android:style/Theme.NoTitleBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
        <activity android:name="TagViewer"
            android:theme="@android:style/Theme.NoTitleBar"
        >
            <intent-filter>
                <action android:name="android.nfc.action.TAG_DISCOVERED"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>
    </application>
    <uses-sdk android:minSdkVersion="9" />
    <uses-feature android:name="android.hardware.nfc" android:required="true" />
</manifest>