android NFC 程序设计
NFC简介
NFC是Near Field Communication缩写,即近距离无线通讯技术。由飞利浦公司和索尼公司共同开发的NFC是一种非
接触式识别和互联技术,可以在移动设备、消费类电子产品、
PC 和智能控件工具间进行近距离无线通信。
13.56MHz频率运行于20厘米距离内。其传输速度有106 Kbit/秒、212 Kbit/秒或者424 Kbit/秒三种。目前近场通信已通
过成为ISO/IEC IS 18092国际标准、ECMA-340标准与ETSI
TS 102 190标准。NFC采用主动和被动两种通信模式。
手机NFC支持三种工作模式:读/写标签模式,点到点模式,模拟卡片模式。
NFC的基本类
Android平台提供了两个android.nfc 和android.nfc.tech包,里面有API来实现NFC标签的操作。
android.nfc包的主要有4个类:
NfcManager类:可以用来管理Android设备中指出的所有NFC Adapter,但由于大部分Android设备只支持一个NFC
Adapter,可以直接使用getDefaultAapater方法来获取系统支持的Adapter。
NfcAdapter类:本设备的NFC adapter,可以定义Intent来请求将系统检测到tags的提醒发送到你的Activity,并提供方
法去注册前台tag提醒发布和前台NDEF推送。
NdefMessage类:NDEF是NFC论坛定义的数据结构,用来有效的存数据到标签中,如文本,URL,和其他MIME类
型。一个NdefMessage扮演一个容器,这个容器存哪些发送和读到的数据。一个NdefMessage对象包含0或多个
NdefRecord,每个NDEF record有一个类型,比如文本,URL,智慧型海报/广告,或其他MIME数据。在
NDEFMessage里的第一个NfcRecord的类型用来发送tag到一个android设备上的activity。
Tag类:标示一个被动的NFC目标,比如tag,card,钥匙挂扣,甚至是一个电话模拟的的NFC卡。可提供对标签的各
种操作方法。
android.nfc.tech包
android.nfc.tech包含那些对tag查询属性和进行I/O操作的类。这些类分别标示一个tag支持的不同的NFC技术标准。
TagTechnology: 这个接口是下面所有tag technology类必须实现的。
NfcA: 支持ISO 14443-3A 标准的属性和I/O操作。
NfcB:NFC-B (ISO 14443-3B)的属性和I/O操作。
NfcF:NFC-F (JIS 6319-4)的属性和I/O操作。
NfcV: NFC-V (ISO 15693)的属性和I/O操作。
IsoDep:ISO-DEP (ISO 14443-4)的属性和I/O操作。
Ndef:对支持NDEF格式的标签进行读写操作。
NdefFormatable: 对那些可以被格式化成NDEF格式的tag提供一个格式化的操作。
MifareClassic: 如果android设备支持MIFARE,提供对MIFARE Classic目标的属性和I/O操作。
MifareUltralight: 如果android设备支持MIFARE,提供对MIFARE Ultralight目标的属性和I/O操作。
NFC编程基本步骤
设置权限
限制版本号
限制安装的设备
定义可接收Tag的Activity(可获得标签的相关信息)
处理业务(根据便签的具体业务)
NFC标签过滤系统
NfcManager类详解:
Use getSystemService(java.lang.String) with NFC_SERVICE to create an NfcManager, then call getDefaultAdapter() to obtain the NfcAdapter.
Alternately, you can just call the static helper getDefaultAdapter(android.content.Context).
public static NfcAdapter getDefaultAdapter (Context context):获取手机中默认的NFC设备,一般一部手机就只有一
个NFC模块,所有调用此方法即可。
NfcAdapter类详解:
重要的常量(用于从Intent中获取获取信息,这个Intent是NFC检测到Tag后由系统发起的,由getIntent().getParcelableExtra(NfcAdapter.常量名);方法获取相应对象):
EXTRA_TAG(必须的):它是一个代表了被扫描到的标签的Tag对象;可通过
getParcelableExtra(NfcAdapter.EXTRA_TAG)获得标签对象。
EXTRA_NDEF_MESSAGES(可选):它是一个解析来自标签中的NDEF消息的数组。这个附加信息是强制在Intent对
象上的;可通过 getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)获得NDEF消息。
EXTRA_ID(可选):标签的低级ID。
以下三个常量用于对获取的Intent中的Tag类型进行判断:
ACTION_NDEF_DISCOVERED:NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())
ACTION_TAG_DISCOVERED:NfcAdapter.ACTION_TAG_DISCOVERED.equals(getIntent().getAction())
ACTION_TECH_DISCOVERED:NfcAdapter.ACTION_TECH_DISCOVERED.equals(getIntent().getAction())
重要方法:
public boolean isEnabled ():用于判断当前NFC是否处于可用状态
public void enableForegroundDispatch (Activity activity, PendingIntent intent, IntentFilter[] filters, String[][]
techLists):Enable foreground dispatch to the given Activity.用于打开前台调度(拥有最高的权限),当这个Activity
位于前台(前台进程),即可调用这个方法开启前台调度,一般位于onResume()回调方法中
public void disableForegroundDispatch (Activity activity):关闭前台调度,一般位于onStop()回调方法中
NdefMessage类详解:
以下三个方法用于构造一个NDEF数据 结构的的Tag数据(用于在Activity与标签之间的数据传递,读取与写入都要用
该对象进行封装)
public NdefMessage (byte[] data)
public NdefMessage (NdefRecord record, NdefRecord... records)
public NdefMessage (NdefRecord[] records)
public byte[] toByteArray ():
public int getByteArrayLength ():
public NdefRecord[] getRecords ():Get the NDEF Records inside this NDEF Message.
NdefRecord类详解:
以下两个为构造方法:
public NdefRecord (short tnf, byte[] type, byte[] id, byte[] payload):
public NdefRecord (byte[] data):
以下四个方法获取NdefRecord对象对应字段的类型:
public byte[] getType ():
public short getTnf ():
public byte[] getPayload ():
public byte[] getId ():
Tag类详解:
public String[] getTechList ():Get the technologies available in this tag, as fully qualified class names.
Ndef类详解:
该类用于对NDEF格式的Tag进行读写操作的封装,不同的Tag用不同的类封装,都在android.nfc.tech包中
public static Ndef get (Tag tag):Get an instance of Ndef for the given tag.构建对象
public void connect ():Enable I/O operations to the tag from this TagTechnology object.,打开I/O操作
public boolean isWritable ():Determine if the tag is writable.判断是否可写
public int getMaxSize ():Get the maximum NDEF message size in bytes.
public void writeNdefMessage (NdefMessage msg):Overwrite the NdefMessage on this tag.向这个Tag写入数据
public String getType ():Get the NDEF tag type.
public boolean makeReadOnly ():Make a tag read-only.
NdefFormatable类详解:
用于将其他类型的格式格式化成Ndef格式
public static NdefFormatable get (Tag tag):Get an instance of NdefFormatable for the given tag.Returns null if
NdefFormatable was not enumerated in getTechList(). This indicates the tag is not NDEF formatable by this Android
device.
public void connect ():Enable I/O operations to the tag from this TagTechnology object.
public void format (NdefMessage firstMessage):Format a tag as NDEF, and write a NdefMessage.
NFC前台调度
将处理NFC标签的权利交给某个窗口(优先级最高)
1、在onCreate()中获得NfcAdapter对象;
2、创建与该Activity关联的PendingIntent;
3、指定一个用于处理NFC标签的窗口;通常会在onResume()方法中采用nfcAdapter.enableForegroundDispatch()
来实现;
4、禁止窗口处理NFC标签。采用nfcAdapter.disableForegroundDispatch()来实现。
权限设置
在你能访问一个设备的NFC硬件和正确的处理NFC的Intent之前,需要在AndroidManifest.xml中先声明下面的项:
1.NFC使用 <uses-permission> 元素来访问NFC硬件:
<uses-permission android:name=“android.permission.NFC” />
2.最小SDK版本需要设置正确, API level 9只包含有限的tag支持;用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。