现在很多手机已经配备了NFC(Near Field Communication 近场通信)的功能,我就为此专门研究过,可以到本文末尾下载源代码。

Android官方资料:http://developer.android.com/guide/topics/connectivity/nfc/index.html

相关资料参考:http://blog.csdn.net/nicebooks/article/details/6223956

相关Android应用:https://play.google.com/store/apps/details?id=com.nxp.nfc.tagwriter

关于NFC的知识就不讲了,下面直接看代码,主要是读取、写入的功能。先自己新建一个Android工程,下面是用到的变量:private NfcAdapter mNfcAdapter;//NFC适配器,就是那个NFC读卡器 PendingIntent mNfcPendingIntent;//用于截获系统Intent,因为系统检测到NFC卡片时会选择程序去响应 IntentFilter[] mWriteTagFilters;//IntentFilter表示满足本程序响应的条件 private boolean mWriteMode = false;//控制读写模式切换

还是建议看看官方资料,这样才能明白某些函数的意思。接下来,在onCreate函数里检测NFC://获取默认NFC设备 mNfcAdapter = NfcAdapter.getDefaultAdapter(this); if (mNfcAdapter == null) { Toast.makeText(this, "该设备不支持NFC!", Toast.LENGTH_LONG).show(); finish(); return; } //查看NFC是否开启 if (!mNfcAdapter.isEnabled()){ Toast.makeText(this, "请在系统设置中先启用NFC功能", Toast.LENGTH_LONG).show(); finish(); return; } mNfcPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); IntentFilter ndefDetected = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED); try { ndefDetected.addDataType("text/plain"); } catch (MalformedMimeTypeException e) { e.printStackTrace(); } mWriteTagFilters = new IntentFilter[] { ndefDetected };

这里先检测手机是否支持NFC,finish()表示退出程序。最后,给上面变量赋值,添加截获的NFC数据类型为"text/plain",表示纯文本。

所以,如果NFC卡片存的是URL地址,我们的程序将无法截获,系统会用浏览器打开。当我们按下Home键,这时就无需截获系统Intent了,添加如下代码:@Override protected void onResume() { super.onResume(); mNfcAdapter.enableForegroundDispatch(this, mNfcPendingIntent, mWriteTagFilters, null); } @Override protected void onPause() { super.onPause(); mNfcAdapter.disableForegroundNdefPush(this); }

手机发现了NFC Tag,如果我们已经添加了PendingIntent,并且满足我们的IntentFilter条件,就会触发一个如下事件://必须的函数,截获系统itent,然后触发读取和写入操作 @Override protected void onNewIntent(Intent intent) { if (!mWriteMode && NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) { NdefMessage[] msgs = getNdefMessages(intent); String body = new String(msgs[0].getRecords()[0].getPayload()); System.out.println("***读取数据***" + body); tagInfo.setText(body); } if (mWriteMode && NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) { Tag detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); boolean writesuccess = writeTag(getNoteAsNdef(), detectedTag); System.out.println("***写入数据***"); if (writesuccess){ Toast.makeText(this, "写入成功", Toast.LENGTH_SHORT).show(); } else{ Toast.makeText(this, "写入失败!", Toast.LENGTH_SHORT).show(); } } }

系统检测到Tag时,会将其所有信息封装到Intent中,我们截获了它就可以读取了。如果要写入,需要构造NdefMessage信息才行。

上面代码中的getNoteAsNdef用来根据输入构造NdefMessage://从输入框获取信息,然后构造NdefMessage用于写入 private NdefMessage getNoteAsNdef() { byte[] textBytes = (inputText.getText().toString()).getBytes(); NdefRecord textRecord = new NdefRecord(NdefRecord.TNF_MIME_MEDIA, "text/plain".getBytes(), new byte[] {}, textBytes); return new NdefMessage(new NdefRecord[] { textRecord }); }

实际读取数据部分如下://实际读取数据部分 private NdefMessage[] getNdefMessages(Intent intent) { NdefMessage[] msgs = null; String action = intent.getAction(); if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action) || NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) { Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); if (rawMsgs != null) { msgs = new NdefMessage[rawMsgs.length]; for (int i = 0; i < rawMsgs.length; i++) { msgs[i] = (NdefMessage) rawMsgs[i]; } } else { //Unknown tag type byte[] empty = new byte[] {}; NdefRecord record = new NdefRecord(NdefRecord.TNF_UNKNOWN, empty, empty, empty); NdefMessage msg = new NdefMessage(new NdefRecord[] { record }); msgs = new NdefMessage[] { msg }; } } else { //Log.d(TAG, "Unknown intent."); finish(); } return msgs; }

实际写入部分如下://实际写入数据部分 boolean writeTag(NdefMessage message, Tag tag) { int size = message.toByteArray().length; try { Ndef ndef = Ndef.get(tag); if (ndef != null) { ndef.connect(); if (!ndef.isWritable()) { System.out.println("Tag is read-only."); return false; } if (ndef.getMaxSize() < size) { System.out.println("Tag capacity is " + ndef.getMaxSize() + " bytes, message is " + size + " bytes."); return false; } ndef.writeNdefMessage(message); System.out.println("****写入数据成功***"); return true; } else { NdefFormatable format = NdefFormatable.get(tag); if (format != null) { try { format.connect(); format.format(message); System.out.println("**Formatted tag and wrote message**"); return true; } catch (IOException e) { System.out.println("==Failed to format tag.=="); return false; } } else { System.out.println("Tag doesn't support NDEF."); return false; } } } catch (Exception e) { System.out.println("!!写入数据失败!!"); } return false; }

上面的写入、读取部分都不是很简洁,因为要兼容到android 2.3(API 10)的版本,Android 4.0以上提供了跟简单的读写方式,可以参考下面的文章:

http://shanetully.com/2012/12/writing-custom-data-to-nfc-tags-with-android-example/

如果你需要这样的功能,比如检测到文本时便启动你的程序,你可以在配置文件里设置,查看官方文档即可,我这里没有这样的需求。

最后,打开AndroidManifest.xml文件,添加如下代码用于开启NFC权限。注意,我的源代码。

android nfc的用法,Android下NFC的简单使用相关推荐

  1. android中view用法,Android中ImageView用法实例分析

    本文实例分析了Android中ImageView用法.分享给大家供大家参考,具体如下: 猜牌游戏大家可能以前都玩过,这里我们用这个小游戏来说明ImageView的用法. 首先,在res/drawabl ...

  2. android palette组件用法,Android Support Palette使用详解

    使用Palette API选择颜色 良好的视觉设计是app成功所必不可少的, 而色彩设计体系是设计的基础构成. Palette包是支持包, 能够从图片中解析出突出的颜色, 从而帮助你创建出视觉迷人的应 ...

  3. android span的用法,Android Span的使用

    Android中TextView作为最常用的组件, 常常有很多特殊的需求,例如:嵌入图标.部分文字可点击,点击链接等,这些需求都可以通过Span来实现. 上面就是系统提供的所有可用的Span类.下面就 ...

  4. android palette组件用法,android Palette使用详解

    Palette是一个可以从图片(Bitmap)中提取颜色的帮助类,可以使UI更加美观,根据图片动态的显示相应的颜色.现在最新的api是在版本22.0.0添加的,本篇文章也是使用的22.0.0的api版 ...

  5. android palette组件用法,android Palette调色板使用详解

    Palette是一个可以从图片(Bitmap)中提取颜色的帮助类,可以使UI更加美观,根据图片动态的显示相应的颜色.现在最新的api是在版本22.0.0添加的,本篇文章也是使用的22.0.0的api版 ...

  6. android palette组件用法,Android Material Design:使用Palette优化界面色彩搭配。

    我写过一篇博客介绍了常用Material Design控件的使用. http://www.jianshu.com/p/776cc6329fff 本想把大部分的Material Design的知识点写到 ...

  7. android palette组件用法,Android Palette(调色板)的使用

    一.Palette的简单介绍 android-support-v7-palette 里面的Palette是Android L SDK 中的新特性,可以使用 Palette 从图像中提取出突出的颜色(主 ...

  8. android span的用法,android – 如何使用TextAppearanceSpan

    编辑: 你可以使用SuperscriptSpan() Spannable WordtoSpan = new SpannableString("13.500,27"); Wordto ...

  9. Android 10.0 飞行模式下禁用NFC功能

    在测试中发现,打开飞行模式以后,wifi和蓝牙都关闭了,nfc还是能打开的,这也是原生系统的一个bug,客户要求开启飞行模式的时候 禁用nfc,就是 不能打开nfc,既然发现了就必须解决掉这个问题 通 ...

  10. android nfc扇区加密,android NFC MifareClassic 读IC卡加密扇区方法

    近段时间在做android下NFC的M1卡的加密扇区的读取,参考了Android_磊子的操作基础内容,但是涉及到MifareClassic类操作验证未能找到相关资料,后来查看了MifareClassi ...

最新文章

  1. Model Search,了解一下?
  2. linux--vi 和vim 的区别
  3. JS写的不咋地的碰撞检测
  4. python3 scrapy+Crontab部署过程
  5. 虚函数表 vtable
  6. b树与b+树的区别_面试必考:B树、B树、B+树、B*树图文详解
  7. 去重 指定区域数据_大数据分析常用去重算法分析
  8. java读取复杂csv文件内容_java读取并导出多类型数据csv文件
  9. 人之间的尊重是相互的_人与人之间,尊重很重要
  10. 计算机如何快速访问文件夹,高手教你如何快速定位文件夹(图文介绍)
  11. 关于Big-Endian 和Little-Endian
  12. 经验:OrCAD Capture卡顿问题的解决方法
  13. win服务器下利用vlmcsd搭建KMS服务器激活win10
  14. 设置clickhouse默认密码
  15. 代数拓扑1|单纯同调
  16. 微信服务器拒绝发送离线文件,解答:微信怎么接收QQ离线消息?-qq离线文件
  17. 基于Python语言豆瓣电影数据挖掘与分析
  18. C Primer Plus 第2章 课后答案
  19. python 用cx_Freeze打包程序详细解读setup.py
  20. uCLinux简介--

热门文章

  1. python直方图规定化_OpenCV 直方图处理:直方图均衡和规定化(匹配)
  2. TD-SCDMA迫零块线性均衡
  3. ❤️Docker中只需2步即可拥有Oracle 10G环境,史上最快部署❤️
  4. 谷歌输入法linux下载官网下载软件,linux下安装谷歌拼音输入法
  5. 关于google拼音输入法的坑爹问题-IE浏览器浏览网页蓝屏等问题
  6. 三星c7 linux驱动,三星c7驱动|三星c7手机驱动下载 v1.5.55.0 官方版 - 比克尔下载
  7. 安卓移动办公软件_商用软件的爆发7-2016年移动办公
  8. QQ空间制作软件大全
  9. WPS如何使参考文献对齐
  10. 千方百剂医药管理系统对接第三方WMS系统(天力士物流)