Android NFC的使用
Posted gouphigh2
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android NFC的使用相关的知识,希望对你有一定的参考价值。
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);
未完待续
以上是关于Android NFC的使用的主要内容,如果未能解决你的问题,请参考以下文章