您的位置:首页 > 移动开发 > Android开发

Android NFC的使用

2016-03-17 17:55 609 查看

1、NFC介绍

近场通信(Near Field Communication,NFC)是一种短距高频的无线电技术,在13.56MHz频率运行于20cm以内,类似于蓝牙的通讯协议但传输距离更短的通讯方式。其传输速度有106Kb/s,212Kb/s或424Kb/s三种。目前近场通信已通过成为ISO/IEC IS 18092国际标准、ECMA-340标准与ETSI TS 102 190标准。



2、NFC的功能

打开音乐播放器

打开蓝牙连接车载

打开移动网络

打开GPS

设置静音

设置飞行模式

打开商品网页介绍

……

3、NFC标签的写入和读取





准备工作

使用NFC功能,需要配置NFC权限:

<uses-permission android:name="android.permission.NFC" />
<uses-feature android:name="android.hardware.nfc" android:required="true" />


设置接收NFC标签“滴一声”的Activity的启动模式为SingleTop:

android:launchMode="singleTop"


那么在NFC标签贴近手机后背后,系统会发送一个Intent给当前Activity,因为启动模式是singleTop,于是会调用onNewIntent方法,我们在这个方法里给NFC标签写入数据:

@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
write(intent);
}


还要不能忘了在onResume和onPause中设置NFC优先处理:

@Override
protected void onResume() {
super.onResume();
if (nfcAdapter != null) {
//设置当前程序为优先处理nfc的程序
nfcAdapter.enableForegroundDispatch(this, pi, null, null);
}
}

@Override
protected void onPause() {
super.onPause();
if (nfcAdapter != null) {
nfcAdapter.disableForegroundDispatch(this);
}
}


NFC标签写入

private void write(Intent intent) {
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
if (tag == null) {
return;
}

//写入数据
NdefRecord[] ndefRecord = new NdefRecord[4];
ndefRecord[0] = NdefRecord.createApplicationRecord("com.idengpan.nfc");//packageName//打开某个APP
ndefRecord[1] = NdefRecord.createUri("http://blog.csdn.net/ada_dengpan");//打开网页
ndefRecord[2] = new NdefRecord(NdefRecord.TNF_WELL_KNOWN,NdefRecord.RTD_TEXT,new byte[]{0},"com.idengpan.nfc".getBytes(Charset.forName("utf-8")));//写入纯文本
ndefRecord[3] = new NdefRecord(NdefRecord.TNF_WELL_KNOWN,NdefRecord.RTD_TEXT,new byte[]{0},"1".getBytes(Charset.forName("utf-8")));//写入纯文本

NdefMessage ndefMessage = new NdefMessage(ndefRecord);

Ndef ndef = Ndef.get(tag);//当做是一种NDEF格式
try {
if (ndef != null) {
ndef.connect();
if (ndef.isWritable()) {
int size = ndefMessage.toByteArray().length;
if (ndef.getMaxSize() > size) {
ndef.writeNdefMessage(ndefMessage);
}else{
Toast.makeText(getApplicationContext(),"写入数据超过NFC标签容量" + size +" > " + ndef.getMaxSize(),Toast.LENGTH_SHORT).show();
}
}
} else {
NdefFormatable ndefFormatable = NdefFormatable.get(tag);
if (ndefFormatable != null) {
ndefFormatable.connect();
ndefFormatable.format(ndefMessage);
}
}
Toast.makeText(getApplicationContext(), "写入成功!", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
} catch (FormatException e) {
e.printStackTrace();
}

}


上面的例子写入了4条记录到NFC标签中,那么退出当前NFC app后,将NFC标签贴近手机后背,就会执行每一条记录内容。其中,前两条是系统自带的行为,第一个是打开某个包名的app,第二个是使用系统默认浏览器打开一个网页。当然,还有其他行为可以看相关源码。

NFC读取

private void read(Intent intent){
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
if (tag == null) {
return;
}
if(NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())){
Parcelable[] data = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
if(data != null){
NdefMessage [] ndefMessages = new NdefMessage[data.length];
for(int i=0;i<ndefMessages.length;i++){
ndefMessages[i] = (NdefMessage) data[i];
NdefRecord [] ndefRecords = ndefMessages[i].getRecords();

//获取标签里的文本
String packageName = new String(ndefRecords[2].getPayload());
String flag = new String(ndefRecords[3].getPayload());

//根据flag启动蓝牙
if("1".equals(flag)){
//根据写入的值做些什么事
}

//根据包名启动app
Intent  startAPP = getPackageManager().getLaunchIntentForPackage(packageName);
startActivity(startAPP);
}
}
}
}


未完待续

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: