NFC(近场通信)
NFC是一套短距离的无线通信,通常距离是4厘米或更短。NFC工作频率是13.56M Hz,传输速率是106kbit/s 848kbit/s. NFC总是在一个发起者和一个被动目标之间发生。发起者发出近场无线电波,这个近场可以给被动目标供电。这些被动的目标包括不需要电源的标签,卡,也可以是有电源的设备。
与其他无线通信技术比较, 例如蓝牙和WiFi NFC提供更低带宽和距离,并且低成本,不需要供电,不需要实现匹配,整个通信过程仅仅是短短的靠近一秒就能完成。
一个带有NFC支持的android设备通常是一个发起者。也可以作为NFC的读写设备。他将检测NFC tags并且打开一个Activity来处理. Android 2.3.3还有支持有限的P2P
Tags分很多种,其中简单的只提供读写段,有的只能读。复杂的tags可以支持一些运算,加密来控制对tags里数据段的读写。甚至一些tags上有简单的操作系统,允许一些复杂的交互和可以执行一些代码。
API概览
Android.nfc  package包含顶层类用来与本地NFC适配器交互这些类可以表示被检测到的tags和用NDEF数据格式。
Class
Description
NfcManager
一个NFC adapter的管理器,可以列出所有此android设备支持的NFC adapter.只不过大部分android 设备只有一个NFC adapter,所以你大部分情况下可以直接用静态方法getDefaultAdapter(context)来取适配器。
NfcAdapter
表示本设备的NFC adapter,可以定义Intent来请求将系统检测到tags的提醒发送到你的Activity.并提供方法去注册前台tag提醒发布和前台NDEF推送。 前台NDEF推送是当前android版本唯一支持的p2p NFC通信方式。
NdefMessageandNdefRecord
NDEFNFC论坛定义的数据结构,用来有效的存数据到NFC tags.比如文本,URL,和其他MIME类型。一个NdefMessage扮演一个容器,这个容器存哪些发送和读到的数据。一个NdefMessage对象包含0或多个NdefRecord,每个NDEF record有一个类型,比如文本,URL,智慧型海报/广告,或其他MIME数据。在NDEFMessage里的第一个NfcRecord的类型用来发送tag到一个android设备上的activity.
Tag
标示一个被动的NFC目标,比如tagcard,钥匙挂扣,甚至是一个电话模拟的的NFC.
当一个tag被检测到,一个tag对象将被创建并且封装到一个Intent里,然后NFC 发布系统将这个IntentstartActivity发送到注册了接受这种Intentactivity里。你可以用getTechList()方法来得到这个tag支持的技术细节和创建一个h提供的相应的TagTechnology对象。
h package 包含那些对tag查询属性和进行I/O操作的类。这些类分别标示一个tag支持的不同的NFC技术标准。
Class
Description
TagTechnology
这个接口是下面所有tag technology类必须实现的。
NfcA
支持ISO 14443-3A 标准的操作。Provides access to NFC-A (ISO 14443-3A) properties and I/O operations.
NfcB
Provides access to NFC-B (ISO 14443-3B) properties and I/O operations.
NfcF
Provides access to NFC-F (JIS 6319-4) properties and I/O operations.
NfcV
Provides access to NFC-V (ISO 15693) properties and I/O operations.
IsoDep
Provides access to ISO-DEP (ISO 14443-4) properties and I/O operations.
Ndef
提供对那些被格式化为NDEFtag的数据的访问和其他操作。
Provides access to NDEF data and operations on NFC tags that have been formatted as NDEF.
NdefFormatable
对那些可以被格式化成NDEF格式的tag提供一个格式化的操作
MifareClassic
如果android设备支持MIFARE,提供对MIFARE Classic目标的属性和I/O操作。
MifareUltralight
如果android设备支持MIFARE,提供对MIFARE Ultralight目标的属性和I/O操作。
声明l的元素
在你能访问一个设备的NFC硬件和正确的处理NFCIntent之前,需要在l中先声明下面的项:
1.     NFC使用 <uses-permission> 元素来访问NFC硬件:
<uses-permission android:name="android.permission.NFC" />
2.     最小SDK版本需要设置正确,API level 9只包含有限的tag支持,包括:
    .通过ACTION_TAG_DISCOVERED来发布Tag信息
    .只有通过EXTRA_NDEF_MESSAGES扩展来访问NDEF消息
    .其他的tag属性和I/O操作都不支持
所以你可能想要用API level 10来实现对tag的广泛的读写支持。
<uses-sdk android:minSdkVersion="10"/>
3.     uses-feature 元素定义:你的程序可以再android市场里显示有NFC硬件。
<uses-feature android:name="android.hardware.nfc" android:required="true" />
4.      NFC intent filter告诉android系统你的activity能处理NFC数据,可以定义1个或多个intent filter:
<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>
上边3intent filters 有优先级,更多信息可以看下面的Tag发布系统
也可以看NFCDemo例子的 来有个更深的理解。
Tag发布系统
android设备扫描到一个NFC tag,通用的行为是自动最合适的Activity会处理这个tag Intent而不需要用户来选择哪个Activity来处理。因为设备扫描NFC tags是在很短的范围和时间,如果让用户选择的话,那就有可能需要移动设备,这样将会打断这个扫描过程。你应该开发你只处理需要处理的tagsActivity,以防止让用户选择使用哪个Activity来处理的情况。Android提供两个系统来帮助你正确的识别一个NFC tag是否是你的Activity想要处理的:Intent发布系统和前台Activity发布系统。
Intent发布系统检查所有Activitiesintent filters,出那些定义了可以处理此tagActivity
如果有多个Activity都配置了处理同一个tag Intent,那么将使用Activity选择器来让用户选择使用哪个Activity。用户选择之后,将使用选择的Activity来处理此Intent.
前台发布系统允许一个Activity覆盖掉Intent发布系统而首先处理此tag Intent,这要求你将要处理Tag IntentActivity运行在前台,这样当一个NFC tag被扫描到,系统先检测前台的Activity是否支持处理此Intent,如果支持,即将此Intent传给此Activity,如果不支持,则转到Intent发布系统。
使用Intent发布系统
Intent发布系统指定了3intent有不同的优先级。通常当一个tag被检测到之后,Intent就被启动(start)了,这个启动遵循以下行为:
         android.nfc.action.NDEF_DISCOVERED这个intent是在一个包含NDEF负载的tag被检测到时启动,这是最高优先级的intent, android系统不会让你指定一个Intent能处理所有的NFC数据类型,你必须在l中指定与NFC tag对应的<data>元素,这样当扫描到的tag传过来的数据类型与你定义的相匹配时,你的Activity就会被调用。例如
想处理一个包含plain text  NDEF_DISCOVERED intent ,你要按照如下定义l file:
<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
    <data android:mimeType="text/plain" />
</intent-filter>
如果NDEF_DISCOVERED intent 已经被启动,TECH_DISCOVERED  TAG_DISCOVERED intents 将不会被启动。假如一个未知的tag或者不包含NDEF负载的tag被检测到,此Intent就不会被启动。
         android.nfc.action.TECH_DISCOVERED安卓intent用法: 如果 NDEF_DISCOVERED intent没启动或者没有一个Activityfilter检测NDEF_DISCOVERED ,并且此tag是已知的,那么此TECH_DISCOVERED Intent将会启动.TECH_DISCOVERED intent要求你在一个资源文件里(xml)里指定你要支持technologies列表。更多细节请看下面的Specifying tag technologies to handle.
         android.nfc.action.TAG_DISCOVERED如果没有一个activity处理_DISCOVERED and TECH_DISCOVEREDintents或者tag被检测为未知的,那么此Intent将会被启动。
Specifying tag technologies to handle指定处理的technologies
假如你的Activityl文件里声明了处理android.nfc.action.TECH_DISCOVERED intent ,你必须创建一个Xml格式的资源文件,并加上你的activity支持的technologiestech-list集合里。这样你的activity将被认作能处理这些tech-list的处理者,如果tag使用的technology属于你的定义的list里,你的Activity将接收此Intent。你可以用getTechList()来获得tag支持的technologies

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。