高级 NFC

本文档介绍了高级的NFC主题,如各种标签技术,NFC标签写入和前台发布,它允许即使当其他应用程序过滤器相同的时候,应用程序在前台处理Intent。

Tag技术支持工作



当使NFC Tag和Android的供电设备生效,使用Tag来读取和写入数据的主要格式是NDEF,当设备扫描NDEF数据的Tag,Android提供支持解析的消息,并在可能的情况下将它传入一个NdefMessage,但是,在有些情况下,当你扫描不包含NDEF数据的Tag或当NDEF数据时无法映射到MIME类型或URI时。在那样的情况下,你需要直接与Tag建立沟通及用自己的协议(在原始字节)读写它,Android用android.nfc.tech包对那些情况提供了通用的支持,如表1中所描述的。您可以使用getTechList()方法来确定技术支持Tag,并且用由android.nfc.tech提供的类的其中一个创建相应TagTechnology对象.

表 1. 支持的Tag技术

描述
TagTechnology 这个接口是下面所有tag technology类必须实现的。
NfcA 提供访问 NFC-A (ISO 14443-3A) 的属性和 I/O 操作
NfcB 提供访问 NFC-B (ISO 14443-3B) 的属性和 I/O 操作
NfcF 提供访问 NFC-F (JIS 6319-4) 的属性和 I/O 操作
NfcV 提供访问 NFC-V (ISO 15693)  的属性和 I/O 操作
IsoDep 提供访问 ISO-DEP (ISO 14443-4) 的属性和 I/O 操作
Ndef 提供对那些被格式化为NDEF的tag的数据的访问和其他操作
NdefFormatable 对那些可以被格式化成NDEF格式的tag提供一个格式化的操作

下面的Tag技术不要求被Android的供电设备支持。

表 2. 可选的支持的Tag技术

描述
MifareClassic 如果android设备支持MIFARE,提供对MIFARE Classic目标的属性和I/O操作。
MifareUltralight 如果android设备支持MIFARE,提供对MIFARE Ultralight目标的属性和I/O操作。

Tag技术工作和 ACTION_TECH_DISCOVERED Intent


当一个设备扫描一个有NDEF数据的Tag,但不能被映射到一个MIME或URI时,Tag发布系统试图启动一个Activity与ACTION_TECH_DISCOVERED Intent。当非NDEF被扫描到时,ACTION_TECH_DISCOVERED的Tag也可以使用.如果Tag发布系统无法为你解析它,此回退让你直接进行扫描标签上的数据,基本步骤与标签技术如下:

  1. 过滤一个你想要处理的Tag技术的 ACTION_TECH_DISCOVERED intent. 获取更多信息请参阅 过滤 NFC intents. 一般来说。 当一个NDEF消息不能被映射到MIME类型或者URI上时,Tag发布系统尝试启动一个ACTION_TECH_DISCOVERED intent, 否则如果被扫描到的Tag不包含NDEF数据. 欲了解如何确定的更多信息,请参阅Tag发布系统.
  2. 当你的应用程序接收到该Intent, 从以图中获取Tag对象:
    Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
  3. 通过调用在android.nfc.tech包的类中的一个get factory方法,获取到TagTechnology的一个实例 . 你可以在调用一个get factory方法以前,计算支持Tag技术通过调用getTechList(). 举例来说, 为了从一个Tag得到MifareUltralight的一个实例, 请执行下列操作:
    MifareUltralight.get(intent.getParcelableExtra(NfcAdapter.EXTRA_TAG));

读取和写入Tags

读取和写入NFC tag涉及到从Intent中获取到Tag并创建与tag的连接. 你必须定义你自己的协议来读写数据到Tag. 然后,记住当直接使用Tag时你仍然能够读写NDEF数据. 你想要如何构建东西,它可以实现. 如下的例子演示如何使用一个MIFARE Ultralight tag.

package com.example.android.nfc;import android.nfc.Tag;import android.nfc.tech.MifareUltralight;import android.util.Log;import java.io.IOException;import java.nio.charset.Charset;publicclassMifareUltralightTagTester{privatestaticfinalString TAG =MifareUltralightTagTester.class.getSimpleName();publicvoid writeTag(Tag tag,String tagText){MifareUltralight ultralight =MifareUltralight.get(tag);try{
ultralight.connect();
ultralight.writePage(,"abcd".getBytes(Charset.forName("US-ASCII")));
ultralight.writePage(,"efgh".getBytes(Charset.forName("US-ASCII")));
ultralight.writePage(,"ijkl".getBytes(Charset.forName("US-ASCII")));
ultralight.writePage(,"mnop".getBytes(Charset.forName("US-ASCII")));}catch(IOException e){Log.e(TAG,"IOException while closing MifareUltralight...", e);}finally{try{
ultralight.close();}catch(IOException e){Log.e(TAG,"IOException while closing MifareUltralight...", e);}}}publicString readTag(Tag tag){MifareUltralight mifare =MifareUltralight.get(tag);try{
mifare.connect();byte[] payload = mifare.readPages();returnnewString(payload,Charset.forName("US-ASCII"));}catch(IOException e){Log.e(TAG,"IOException while writing MifareUltralight
message...", e);}finally{if(mifare !=null){try{
mifare.close();}catch(IOException e){Log.e(TAG,"Error closing tag...", e);}}}returnnull;}}

使用前端发布系统


前端发布系统允许一个activity拦截一个 intent并且要求由于其他处理同样intent的activities. 使用这个系统涉及到为了Android系统能够发送合适的intents给你的应用程序而构建几个数据结构. 为了使前端发布系统有效:

  1. 在你的activity的 onCreate()方法中添加如下代码:
    1. 创建一个 PendingIntent 对象, 以便系统可以在它被扫描到时,用tag的细节填充它

      PendingIntent pendingIntent =PendingIntent.getActivity(this,,newIntent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),);
    2. 在Intent filters里声明你想要处理的Intent,一个tag被检测到时先检查前台发布系统,如果前台Activity符合Intent filter的要求,那么前台的Activity的将处理此Intent。如果不符合,前台发布系统将Intent转到Intent发布系统。如果指定了null的Intent filters,当任意tag被检测到时,你将收到TAG_DISCOVERED intent。下面的代码片断处理所有NDEF_DISCOVERED的MIME类型. 因此请注意你应该只处理你想要的Intent。
      IntentFilter ndef =newIntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);try{
      ndef.addDataType("*/*");/* Handles all MIME based dispatches.
      You should specify only the ones that you need. */}catch(MalformedMimeTypeException e){thrownewRuntimeException("fail", e);}
      intentFiltersArray =newIntentFilter[]{ndef,};
    3. 设置一个你程序要处理的Tag technologies的列表,调用Object.class.getName() 方法来获得你想要支持处理的technology类。
      techListsArray =newString[][]{newString[]{NfcF.class.getName()}};
  2. 覆盖下面的方法来打开或关闭前台发布系统。比如onPause()和onResume()方法。必须在主线程里调用enableForegroundDispatch(Activity, PendingIntent, IntentFilter[], String[][]) 而且Activity在前台(可以在onResume()里调用来保证这点)。你也要覆盖onNewIntent回调来处理得到的NFC tag数据。
    publicvoid onPause(){super.onPause();
    mAdapter.disableForegroundDispatch(this);}publicvoid onResume(){super.onResume();
    mAdapter.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techListsArray);}publicvoid onNewIntent(Intent intent){Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);//do something with tagFromIntent}
从API Demos获取完整的示例演示ForegroundDispatch例子

NFC高级的更多相关文章

  1. Android训练课程(Android Training) - NFC基础

    NFC 基础 本文档介绍了在Android上的基本的NFC任务.它说明了如何发送和接收的NDEF消息(NDEF messages)的形式的表单里包含的NFC数据(NFC data),并介绍Androi ...

  2. Android近场通信---高级NFC(二)

    读写NFC标签 读写NFC标签,要涉及到从Intent对象中获取标签,并要打开与标签的通信.要读写NFC标签数据,你必须要定义自己的协议栈.但是,要记住在直接使用NFC标签工作时,你依然能够读写NDE ...

  3. Visual Studio 2015 速递(4)——高级特性之移动开发

    系列文章 Visual Studio 2015速递(1)——C#6.0新特性怎么用 Visual Studio 2015速递(2)——提升效率和质量(VS2015核心竞争力) Visual Studi ...

  4. 【NFC】Android NFC API Reference中英文

    0 Near Field Communication Near Field Communication (NFC) is a set of   short-range wireless technol ...

  5. NFC基础

    本文档描述了在Android执行的基本的NFC技术,它说明了如何发送和接收NDEF消息的形式的NFC数据,并介绍Android框架中支持这些功能的API,对于更高级的主题,包括讨论非NDEF数据相关的 ...

  6. NFC会员管理-转载自http://technews.cn/2014/09/13/nfc-sticker/

    基隆的百年名店“李鹄饼店”误用馊水油,客人纷纷上门退货,因退货条件宽松,客人一货两退,造成巨大的损失.为了平息客人的愤怒,店家允许客人凭发 票或商品办理退货,有的客人先用发票退一次钱,再用商品退一次钱 ...

  7. Android NFC开发(一)——初探NFC,了解当前前沿技术

    Android NFC开发(一)--初探NFC,了解当前前沿技术 官方文档:http://developer.android.com/guide/topics/connectivity/nfc/ind ...

  8. Visual Studio 2015速递(4)——高级特性之移动开发

    系列文章 Visual Studio 2015速递(1)——C#6.0新特性怎么用 Visual Studio 2015速递(2)——提升效率和质量(VS2015核心竞争力) Visual Studi ...

  9. 《Android传感器高级编程》

    <Android传感器高级编程> 基本信息 原书名:Professional Android Sensor Programming 原出版社: Wrox 作者: (美)米内特(Greg M ...

随机推荐

  1. Spring.Net 初探

    Spring.Net 初探之牛刀小试   又是一个周末,感受着外面30°的高温,果断宅在家里,闲来无事,就研究了一下spring .net 框架, 在这里不得不说 vs2013确实是一个强大的开发工具 ...

  2. linux内核包转发过程(三)NIC帧接收分析

    [版权声明:转载请保留源:blog.csdn.net/gentleliu.邮箱:shallnew*163.com] 每一个cpu都有队列来处理接收到的帧.都有其数据结构来处理入口和出口流量,因此.不同 ...

  3. linux下一个Oracle11g RAC建立(四)

    linux下一个Oracle11g RAC建立(四) 三.配置共享存储 配置ASM管理准备 1)OCRDISK :存储CRS资源配置信息 2)VOTEDISK:仲裁盘.记录节点状态 3)DataDis ...

  4. 数字使用相应的加密策略传递一个字符串后Java实现代码

    公司采用公用电话传递数据,数据小于8整数位,为了确保安全,     在转移的过程中需要加密,加密规则如下面的:         第一个数据下降,附图然后各加5,和除以10的余数取代该数字,       ...

  5. ubuntu 14.04 hadoop eclipse 0配置基本环境

    动人的hadoop第二天.构造hadoop该环境还花了两天时间,在这里写自己配置的过程,我希望能帮助! 我将文中用到的全部资源都分享到了  这里,点开就能下载,不须要一个个的找啦! 当中有<Ha ...

  6. 大数据系列修炼-Scala课程06

    关于Scala中的正则表达式与模式匹配结合的正则表达式Reg 正则表达式的实现:正则表达式的定义与其它语言差不多,只需在表达式后加一个.r,并且可以遍历相应的表达式进行匹配 //定义的正则表达式 va ...

  7. 从头开始学JavaScript (十一)——Object类型

    原文:从头开始学JavaScript (十一)--Object类型 一.object类型 一个object就是一系列属性的集合,一个属性包含一个名字(属性名)和一个值(属性值). object对于在应 ...

  8. C#中利用双缓冲技术解决绘图闪屏问题。

    这段时间在做一个小型游戏,在界面显示的时候用到了一些图形.一开始涉及到的图形全都用控件的背景图片代替了.这样游戏运行的时候存在的一个很大的问题是游戏运行很慢.小组成员费尽周折,即将放弃,每一个成员都愁 ...

  9. android--解--它们的定义tabhost(动态添加的选项+用自己的主动性横向滑动标签+手势切换标签页和内容特征)

    在本文中,解决他们自己的定义tabhost实现,并通过代码集成动态加入标签功能.自己主动标签横向滑动功能.和手势标签按功能之间切换. 我完成了这个完美的解决方案一起以下: 1.定义tabwidget布 ...

  10. 前端学习笔记(zepto或jquery)—— 布局技巧(一)

    html5中有一些标签我们很难改变其样式,例如input=file,select等.这个时候我们需要改变一下思路,将原有透明度置为0,借助于div或span等以控制样式的标签来代替. 效果图: < ...