NFC
近场通信(Near Field Communication,简称NFC),是一种新兴的技术,使用了NFC技术的设备可以在彼此相互靠近的情况下进行数据交换,是由非接触式射频识别(RFID)及互连互通技术整合演变而来的,通过在单一芯片上集成感应式读卡器、感应式卡片和点对点通信的功能,利用移动终端实现移动支付、电子票务、门禁、移动身份识别、防伪等应用
NFC标准为了和非接触式智能卡兼容,规定了一种灵活的网关系统,具体分为三种工作模式:
- 读卡器模式
- 仿真卡模式
- 点对点模式
读卡器模式
数据在NFC芯片中,可以简单理解成“
签”。本质就是通过支持NFC的手机或其他电子设备从带有NFC芯片的标签、贴纸、名片等媒介中读写信息。通常NFC标签是不需要外部供电的,当支持NFC的外设向NFC读写数据时,它会发送某种磁场,而这个磁场会自动的向NFC标签供电。
仿真卡模式
在该模式下,数据在支持NFC的手机或其他电子设备中,可以简单理解成“刷手机”。本质上就是将支持NFC的手机或其他电子设备当成借记卡、公交卡、门禁卡等IC卡使用。基本原理是将相应IC卡中的信息凭证封装成数据包存储在支持NFC的外设中。
点对点模式
该模式与蓝牙、红外差不多,用于不同NFC设备之间进行数据交换。NFC的有效距离一般不能超过4厘米,单传输建立速度要比红外和蓝牙技术快很多,传输建立后,NFC会直接利用蓝牙传输,这种技术被称为Android Beam。使用Android Beam传输数据的两部设备不再限于4厘米之内。
点对点模式的典型应用是两部支持NFC的手机或平板电脑实现数据的点对点传输,例如,交换图片或同步设备联系人。
Android NFC的应用场景
- 电子标签识别
- 刷手机
- 点对点付款
- 身份识别
- 信息记录
- 点对点信息传输
不同的NFC标签之间差异很大,有的只支持简单的读写操作,有时还会采用支持一次性写入的芯片,将NFC标签设计成只读的。当然,也存在一些复杂的NFC标签,例如,有些NFC标签可以通过硬件加密的方式限制对某一区域的访问。还有一些标签自带操作环境,允许NFC设备与这些标签更复杂的交互。这些标签中的数据也会采用不同的格式。但Android SDK API主要支持NFC论坛标准(Found Standard),这种标准被称为NDEF(NFC Data Exchange Format,NFC数据交换格式)。
Android SDK API支持如下3种NDEF数据的操作
- 从NFC标签读取NDEF格式的数据
- 向NFC标签写入NDEF格式的数据
- 通过Android Beam技术将NDEF数据发送到另一部NFC设备
编写NFC程序的基本步骤
- 设置权限
<uses-permission android:name="android.permission.NFC"/>
- 限制安装的设备
<uses-feature android:name="android:hardware.nfc"
android:required="true"/>
- 定义可接收Tag的Activity
- 处理业务逻辑
测试NFC程序需要的设备
- 支持NFC的手机或平板电脑
- NFC标签或贴纸若干(可读写)
Android NFC操作
1. 配置AndroidManifest.xml:
<!--NFC权限-->
<uses-permission android:name="android:permission.NFC"/>
<!--要求当前设备必须要有NFC芯片-->
<uses-feature android:name="android.hardware.nfc"
android:required="true"/>
2. 获取设备默认的NfcAdapter对象,判断该设备是否支持NFC功能,若支持,判断此功能是否打开,并且创建一个PendingIntent对象,用于当NFC标签被检测到时,启动我们处理NFC标签的Activity
3. 在OnNewIntent()方法中,获取到Tag对象
@Override
protected void onNewIntent(Intent intent){
super.onNewIntent(intent);
mTag=intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);//获取到Tag标签对象
String[] techList=mTag.getTechList();
System.out.println("标签支持的tachnology类型:");
for(String tech:techList){
System.out.println(tech);
}
}
4. 为了更好的处理NFC标签,我们需要在Activity获取焦点时(onResume),在主线程中启动前台发布系统,并且在Activity失去焦点时(onStop),关闭前台发布系统
5. NFC写标签步骤:
①获取Ndef对象
Ndef ndef=Ndef.get(mTag);//获取ndef对象
②创建文本NdefRecord
③创建NdefMessage,并且写入Ndef标签
④读Ndef文本数据