http://blog.csdn.net/yeruby/article/details/9287337

一、NFC基础知识

1.NFC是什么?

NFC,即Near Field Communication,近距离无线通讯技术,是一种短距离的(通常<=4cm或更短)高频(13.56M Hz)无线通信技术,它提供了一种简单、触控式的解决方案,可以让消费者简单直观地交换信息、访问内容与服务。

2.NFC的技术优势?

与蓝牙相比:NFC操作简单,配对迅速

与RFID相比:NFC适用范围广泛、可读可写,能直接集成在手机中

与红外线相比:数据传输较快、安全性高、能耗低

与二维码相比:识别迅速、信息类型多样

将来与移动支付相结合,势必简化支付的购买流程,重塑消费者的购物模式。

二、具体测试过程:

1.首先要在AndroidManifest.xml中声明如下配置信息:

使用<uses-permission>元素允许设备访问NFC硬件:

[html] view plaincopyprint?
  1. <uses-permission android:name="android.permission.NFC" />
<uses-permission android:name="android.permission.NFC" />

使用<uses-sdk>元素设置最小SDK版本,笔者基于android 4.0环境,因此声明如下:

[html] view plaincopyprint?
  1. <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="14" />
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="14" />

下面这项不一定需要,如果你希望你的软件可以在android market中显示有NFC硬件,可以使用<uses-feature>元素声明:

[html] view plaincopyprint?
  1. <uses-feature android:name="android.hardware.nfc" android:required="true" />
<uses-feature android:name="android.hardware.nfc" android:required="true" />

上面完成了基本的声明,下面讲解NFC TAG的发布系统

2.NFC TAG的发布系统:

当android设备扫描到一个NFC标签时,会自动寻找最适合的Activity来处理这个TAG,如果有多个Activity满足条件的话,会让用户来选择到底使用哪一个Activity来处理,可以理解为就是简单的事件响应与事件处理。

那么如何让一个Activity监听 ”当扫描到NFC标签时” 的这一个事件呢?使用intent filter。

可以理解为当检测到一个NFC标签时,系统自动创建一个相关的Intent对象,含有响应intent filter的Activity将处理这个Intent。

其中,intent filter声明如下:(在AndroidManifest.xml中声明在你需要捕获这个Intent的Activity里)(如下是识别NDEF格式的标签):

[html] view plaincopyprint?
  1. <intent-filter>
  2. <action android:name="android.nfc.action.NDEF_DISCOVERED" ></action>
  3. <category android:name="android.intent.category.DEFAULT" ></category>
  4. <data android:mimeType="text/plain" ></data>
  5. </intent-filter>
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" ></action>
<category android:name="android.intent.category.DEFAULT" ></category>
<data android:mimeType="text/plain" ></data>
</intent-filter> 

当然,你要识别其它的格式也可以,具体可以参考google的有关NFC的规范文档,在这里我只是实现读取NFC标签中NDEF格式的文本信息和将文本信息按NDEF格式写入到NFC标签中的两个功能。

完成上面两步后,当手机碰触到NFC标签时会自动跳到响应的Activity,下面分别实现响应的读写功能即可。

3.读取NFC标签中NDEF格式的文本信息:

先判断手机支不支持NFC功能,若支持,是否已设置开启状态。

[java] view plaincopyprint?
  1. @Override
  2. protected void onCreate(Bundle savedInstanceState) {
  3. super.onCreate(savedInstanceState);
  4. setContentView(R.layout.activity_write);
  5. nfcTView=(TextView)findViewById(R.id.info_tv);
  6. nfcAdapter = NfcAdapter.getDefaultAdapter(this);
  7. if (nfcAdapter == null) {
  8. nfcTView.setText("设备不支持NFC!");
  9. finish();
  10. return;
  11. }
  12. if (nfcAdapter!=null&&!nfcAdapter.isEnabled()) {
  13. nfcTView.setText("请在系统设置中先启用NFC功能!");
  14. finish();
  15. return;
  16. }
  17. }
 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_write);
nfcTView=(TextView)findViewById(R.id.info_tv);
nfcAdapter = NfcAdapter.getDefaultAdapter(this);
if (nfcAdapter == null) {
nfcTView.setText("设备不支持NFC!");
finish();
return;
}
if (nfcAdapter!=null&&!nfcAdapter.isEnabled()) {
nfcTView.setText("请在系统设置中先启用NFC功能!");
finish();
return;
}
}
[java] view plaincopyprint?
  1. @Override
  2. protected void onResume() {
  3. super.onResume();
  4. if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
  5. readFromTag(getIntent());
  6. }
  7. }
 @Override
protected void onResume() {
super.onResume();
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
readFromTag(getIntent());
}
}

读取内容:

[java] view plaincopyprint?
  1. private boolean readFromTag(Intent intent){
  2. Parcelable[] rawArray = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
  3. NdefMessage mNdefMsg = (NdefMessage)rawArray[0];
  4. NdefRecord mNdefRecord = mNdefMsg.getRecords()[0];
  5. try {
  6. if(mNdefRecord != null){
  7. readResult = new String(mNdefRecord.getPayload(),"UTF-8");
  8. return true;
  9. }
  10. }
  11. catch (UnsupportedEncodingException e) {
  12. e.printStackTrace();
  13. };
  14. return false;
  15. }
 private boolean readFromTag(Intent intent){
Parcelable[] rawArray = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
NdefMessage mNdefMsg = (NdefMessage)rawArray[0];
NdefRecord mNdefRecord = mNdefMsg.getRecords()[0];
try {
if(mNdefRecord != null){
readResult = new String(mNdefRecord.getPayload(),"UTF-8");
return true;
}
}
catch (UnsupportedEncodingException e) {
e.printStackTrace();
};
return false;
}

简单说一下NDEF格式:一个NDEF格式的标签使用一个NdefMessage来包装,一个NdefMessage由0个或多个NdefRecord组成,其中有各种各样的NdefRecord,比如放Url的,放文本信息的等等,这里介绍的是放文本信息的NdefRecord的格式:

一个NdefRecord由四个字段构成:

3-bit TNF:类型名称格式可变长度类型RTD:记录类型定义可变长度ID:唯一标识该记录可变长度的负载:就是文本信息

这对读取NDEF格式的标签信息有用,同是在写信息时,自己构造NdefMessage时候还会用到。

4.写入NDEF格式的文本信息到NFC标签中:

有了上面的基础,写就很容易了,无非就是构造好相应的格式的信息出来,再write进去,如下所示:

[java] view plaincopyprint?
  1. @Override
  2. protected void onResume() {
  3. super.onResume();
  4. if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
  5. Tag tag=getIntent().getParcelableExtra(NfcAdapter.EXTRA_TAG);
  6. Ndef ndef=Ndef.get(tag);
  7. try {
  8. ndef.connect();
  9. NdefRecord ndefRecord=createTextRecord(data,Locale.US,true);
  10. NdefRecord[] records={ndefRecord};
  11. NdefMessage ndefMessage=new NdefMessage(records);
  12. ndef.writeNdefMessage(ndefMessage);
  13. } catch (IOException e1) {
  14. // TODO Auto-generated catch block
  15. e1.printStackTrace();
  16. } catch (FormatException e) {
  17. <SPAN style="WHITE-SPACE: pre">     </SPAN>// TODO Auto-generated catch block
  18. <SPAN style="WHITE-SPACE: pre">     </SPAN>e.printStackTrace();
  19. }
  20. }
@Override
protected void onResume() {
super.onResume();
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
Tag tag=getIntent().getParcelableExtra(NfcAdapter.EXTRA_TAG);
Ndef ndef=Ndef.get(tag);
try {
ndef.connect();
NdefRecord ndefRecord=createTextRecord(data,Locale.US,true);
NdefRecord[] records={ndefRecord};
NdefMessage ndefMessage=new NdefMessage(records);
ndef.writeNdefMessage(ndefMessage);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (FormatException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
}
}

好,以上基本完成了读写功能,具体情形根据应用的不同而定。大家有什么问题欢迎留言一起讨论!

关于NFC的标准有很多,不同的标准读写方式不同。NDEF是比较官方的一个标准,支持很多信息类型,具体的参考你可以从NFC Forum(http://www.nfc-forum.org/specs/)下载NDEF 消息标准的技术文档。

Android NFC 标签 读写相关推荐

  1. Android NFC 标签读写Demo与历史漏洞概述

    文章目录 前言 NFC基础 1.1 RFID区别 1.2 工作模式 1.3 日常应用 NFC标签 2.1 标签应用 2.2 应用实践 2.3 标签预览 2.4 前台调度 NFC开发 3.1 NDEF数 ...

  2. Android开发——NFC标签读写

    Android开发----NFC标签读写 前言 最近因为项目需要,特意学习了NFC的Android开发.加上之前并没有系统地学习过Android开发知识,起手比较困难,搞了半天才算一知半解.怎么办呢? ...

  3. android nfc标签类型,Android NFC标签 开发深度解析 触碰的艺术

    原标题:Android NFC标签 开发深度解析 触碰的艺术 本文来自于CSDN博客,作者:郭朝,已获授权,版权归原作者所有,未经作者同意,请勿转载. 欢迎同有博客好文章的作者加微信(ID:tm_fo ...

  4. Android nfc模块读写MifareClassic卡50

     http://3y.uu456.com/bp_8mhvy4gizz721et5ih0i_1.html 一般来说,基于MifareClassic的射频卡:1K:16个分区(sector),每个分区 ...

  5. Android应用实例之----MifareUltralight格式的nfc标签读写

    随着支持nfc通信功能的智能手机更加普及,在移动支付及公交卡.诊疗卡读写等方面将会发挥更大的作用. 首先介绍Android NFC的工作流程: 步骤1:通过android.nfc.NfcAdapter ...

  6. android NFC的读写

    一.NFC知识 1.NFC是什么? NFC,即Near Field Communication,近距离无线通讯技术,是一种短距离的(通常<=4cm或更短)高频(13.56M Hz)无线通信技术, ...

  7. Android NFC标签 开发深度解析 触碰的艺术

    这篇博客是在鸿洋的微信公众号看到的感觉收益非浅.于是转存于自己博客上以后可查阅. 本文由郭朝投稿. 郭朝的博客地址: http://blog.csdn.net/smartbetter 有几天没有更新博 ...

  8. Android NFC标签写入应用包名,感应到标签自动打开应用

    首先在AndroidManifest.xml文件中添加如下配置 <!-- SDK版本至少为14 --> <uses-sdk android:minSdkVersion="1 ...

  9. Android NFC标签写入网址,感应到标签访问网页

    首先在AndroidManifest.xml文件中添加如下配置 <!-- SDK版本至少为14 --> <uses-sdk android:minSdkVersion="1 ...

  10. android nfc刷卡广播,与broadcastreceiver一起收到的Android NFC标签

    我试图在广播接收器中捕获NFC标签,所以我写了一个简单的BR,在onReceive()中打印"asd".在清单xml中,它被描述为: 我只收到这个,根本没有印刷品-. 01-31 ...

最新文章

  1. asp.net客户端脚本验证小技巧
  2. 游戏开发随想之2D游戏架构
  3. Visual Studio 2005 Beta2 简体中文版发布
  4. 线性代数之行列式矩阵术语中英对照
  5. C#下如何实现服务器 + 客户端的聊天程序
  6. Mysql字符串数据插入转义处理
  7. 你可能不知道的Spring Boot那点事
  8. 疑似三星Galaxy S11入网:搭载骁龙865处理器+支持25W快充
  9. oracle搭建dblink,oracle创建dblink方法示例
  10. AXURE 8.1.0.3382 有效激活码
  11. 无线接入中的移动技术
  12. i386和i686的区别
  13. 多台显示器图像拼接组成大屏幕是怎么实现的?
  14. 狂肝两万字带你用pytorch搞深度学习!!!
  15. 中国移动通信互联网短信网关接口协议CMPP2.0(普通文本短信、二进制数据短信)
  16. AJAX 提交表单以及文件上传
  17. 甲基化系列 1. 甲基化之前世今生(Methylation)
  18. Python数据处理016:Pandas 导入导出
  19. 实现IE6、IE7、IE8多版本浏览器共存
  20. KMP算法下,长为n的字符串中匹配长度为m的子串的复杂度为O(m+n)

热门文章

  1. 获取元素属性(offsetHeight、clientHeight...)无效
  2. 快手作者视频如何批量下载
  3. C3P0连接池的使用
  4. 知行之桥®中文版EDI系统正式发布
  5. 《通信原理》复习笔记3----第三章随机过程相关例题(重点与难点)
  6. android加载本地图片
  7. 2台电脑共享一套键鼠方法
  8. 备考OCJP认证知识点总结(三)
  9. 携程酒店自动化360度质量保障体系
  10. weblogic 下载地址