这里写自定义目录标题
Android的NFC读写(一)
NFC简介
代码解析
源码(Demo)
Android的NFC读写(一)
近来,因需求需要开发nfc读写功能,网上查阅了许多资料,发现相关方面资料鱼龙混杂,许多demo甚至无法跑起来,于是无奈只能硬啃官方文档,终于颇有感悟,demo见末尾
nfc相关资料,大家可以参考以下几个网站,里面讲的非常透彻。
NFC简介
这里简单的介绍一下nfc,近场通信(NFC)是一组短距离无线技术,通常需要4cm或更短的距离才能启动连接。NFC允许您在NFC标签和Android设备之间或两个Android设备之间共享小的数据有效负载。在Android中,我们通常会遇到三种操作模式:
读/写模式,允许NFC设备读取和/或写入被动NFC标签和贴纸。
P2P模式,允许NFC设备与其他NFC对等体交换数据; Android Beam使用此操作模式。
卡仿真模式,允许NFC设备本身充当NFC卡。然后,可以通过外部NFC读取器(例如NFC销售点终端)访问模拟的NFC卡。
本文实现了nfc标签NDEF和ultralight两种格式的读取效果
代码解析
首先先配置android权限,文件内容如下:
标签调度系统的基本工作方式如下:
1.尝试以解析NFC标记(ACTION_NDEF_DISCOVERED或其中一个ACTION_TECH_DISCOVERED)时标记调度系统创建的意图启动一个Activity 。
2.如果没有活动过滤该意图,请尝试启动具有下一个最低优先级意图的活动(ACTION_TECH_DISCOVERED或者ACTION_TAG_DISCOVERED),直到应用程序筛选意图或标记分派系统尝试所有可能的意图。
3.如果没有应用程序筛选任何意图,请不执行任何操作。
大家可以参考这张图
然后将Activity启动模式设置为singleTop,在这种模式下,如果Activity已经在任务栈的栈顶了,当再次启动同一个Activity的时候,这个Activity不会被重新创建,而且它的onNewIntent()方法会被调用,但是它的onCreate()、onStart()方法不会被调用。
#####新建xml文件夹,新建nfc_tech文件(自定义):
该文件指定您的活动在tech-list集合中支持的技术,如下所示:
android.nfc.tech.IsoDep
android.nfc.tech.NfcA
android.nfc.tech.NfcB
android.nfc.tech.NfcF
android.nfc.tech.NfcV
android.nfc.tech.Ndef
android.nfc.tech.NdefFormatable
android.nfc.tech.MifareClassic
android.nfc.tech.MifareUltralight
在主界面方法里判断手机是否具有nfc功能,如下所示:
if (mNfcAdapter == null) {
Toast.makeText(this, "该设备不支持nfc", Toast.LENGTH_SHORT).show();
finish();
return;
}
if (!mNfcAdapter.isEnabled()) {
Toast.makeText(this, "请打开nfc开关", Toast.LENGTH_SHORT).show();
Intent intent=new Intent(Settings.ACTION_NFC_SETTINGS);
startActivity(intent);
}
//创建PendingIntent对象,当检查到一个tag标签就会执行此Intent
mPendingIntent=PendingIntent.getActivity(this,0,new Intent(this,getClass()),0);
在onNewIntent方法中取出获取到的标签,并进入读取标签的方法:
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
String techList[] = tag.getTechList();
for (String tech : techList) {
System.out.print(tech);
}
readNdeftag(tag);
自定义读取标签的方法:这里目前只做了NDEF格式的读取:
Ndef ndef = Ndef.get(tag);
try {
ndef.connect();
NdefMessage ndefMessage = ndef.getNdefMessage();
if (ndefMessage != null) {
mReadText.setText(parseTextRecord(ndefMessage.getRecords()[0]));
Toast.makeText(this, "成功", Toast.LENGTH_SHORT).show();
}else {
mReadText.setText("该标签为空标签");
}
源码(Demo)
最后Demo已经上传,欢迎大家交流下载,不足之处,还望请教。
链接: https://github.com/zcyyouminghuo/Android_NfcDemo.