Android网络通信之 NFC

NFC:近场通信,是一种超近距离的无线通信技术。
Android从2.3版本的SDK开始支持基于NFC通信。
基于NFC的识别和通信可分为三个步骤:
1、Android通过设备上NFC的相关硬件和驱动,发现周边的NFC设备或标志,并读取出其中包含的消息和数据;
2、Android会发出请求事件,调用适合的界面组件来处理NFC消息。
3、在寻找到合适的界面组件后,Android会构造并调用该界面组件,但它与NFC标志进行通信。

声明 Android Manifest.xml 的元素:
在你能访问一个设备的 NFC 硬件和正确的处理 NFC 的 Intent 之前,需要在 AndroidManifest.xml 中先声明下面的项
1、允许元素来访问 NFC 硬件:
<uses-permission android:name = "android.permission.NFC" />
2、最小 SDK 版本需要设置正确,API level 9 只包含有限的 tag 支持 , 包括:
. 通过 ACTION_TAG_DISCOVERED来发布 Tag 信息
. 只有通过 EXTRA_NDEF_MESSAGES扩展来访问 NDEF 消息
. 其他的 tag 属性和 I/O 操作都不支持
所以你可能想要用 API level 10 来实现对 tag 的广泛的读写支持。
<uses-sdk android:minSdkVersion = "10" />
3、 uses-feature 元素定义:你的程序可以再 android 市场里显示有 NFC 硬件。
<uses-feature android:name = "android.hardware.nfc" android:required = "true" />
4、NFC intent-filter 告诉 android 系统你的 activity 能处理 NFC 数据,可以定义 1 个或多个 intent filter :
<intent-filter>
  <action android:name = "android.nfc.action.NDEF_DISCOVERED" />
  <data android:mimeType = "mime/type " />
</intent-filter>
<intent-filter>
  <action android:name = "android.nfc.action.TECH_DISCOVERED" />
  <meta-data android:name = "android.nfc.action.TECH_DISCOVERED"
                android:resource = "@xml/nfc_tech_filter .xml" />
</intent-filter>
<intent-filter>
  <action android:name = "android.nfc.action.TAG_DISCOVERED" />
</intent-filter>
上边 3 个 intent filters 有优先级,NDEF_DISCOVERED的优先级最高,TAG_DISCOVERED的优先级最低。

Tag 发布系统:
当 android 设备扫描到一个 NFC tag ,通用的行为是自动找最合适的 Activity 会处理这个 tag Intent 而不需要用户来选择哪个Activity 来处理。因为设备扫描 NFC tags 是在很短的范围和时间,如果让用户选择的话,那就有可能需要移动设备,这样将会打断这个扫描过程。你应该开发你只处理需要处理的 tags 的 Activity ,以防止让用户选择使用哪个 Activity 来处理的情况。Android 提供两个系统来帮助你正确的识别一个 NFC tag 是否是你的 Activity 想要处理的: Intent 发布系统和前台 Activity 发布系统。
Intent 发布系统检查所有 Activities 的 intent filters ,找出那些定义了可以处理此 tag 的 Activity ,如果有多个 Activity 都配置了处理同一个 tag Intent ,那么将使用 Activity 选择器来让用户选择使用哪个 Activity 。用户选择之后,将使用选择的 Activity 来处理此Intent 。
前台发布系统允许一个 Activity 覆盖掉 Intent 发布系统而首先处理此 tag Intent ,这要求你将要处理 Tag Intent 的 Activity 运行在前台,这样当一个 NFC tag 被扫描到,系统先检测前台的 Activity 是否支持处理此 Intent ,如果支持,即将此 Intent 传给此 Activity,如果不支持,则转到 Intent 发布系统。

NFC数据交换格式:
NdefMessage 是交换NFC数据最常用的方式,当然,你仍然可以定义你自己的non-NDEF 数据。
NfcAdapter 用来监测设备对NFC的支持。前台调度系统允许一个活动拦截一个意图并允许这个活动比其他处理相同意图的活动拥有更高的优先级。

因此,在实际开发中,开发者需要尽可能精确地配置Intent-Filter,避免捕获无法处理的NFC事件而影响用户体验;或者采取热拔插Intent-Filter的策略,将用户选择处理组件的流程放在识别之前,从而实现精准选择NFC处理组件。相关示例如下:
// 构造待触发的Intent
PendingIntent pendingIntent = PendingIntent.getActivity(this,0,new Intent(this,getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),0);
//构造Intent-Filter 来处理NFC消息
IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
ndef.addDataType("text/plain");
intentFilterArray = new IntentFilter[]{ndef};
techListsArray = new String[][]{ new String[] { NfcF.class.getNane()}};
......

// 当界面组件位于前台时,监听相关NFC事件
@Override
public void onResume() {
    super.onResume();  
    //NfcAdapter.getDefaultAdapter(this).enableForegroundDispatch(this,pendingIntent,intentFiltersArray,techListsArray);
    NfcAdapter.getDefaultAdapter(this).enableForegroundDispatch(this, mNdefMessage);
}
// 当界面组件位于后台状态时,停止监听
@Override
public void onPause() {
    super.onPause();
    NfcAdapter.getDefaultAdapter(this).disableForegroundDispatch(this);
}

最后,在寻找到合适的界面组件后,Android会构造并调用该界面组件,但它与NFC标志进行通信。组件与NFC标志交换的数据是通过android.nfc.NdefMessage对象来封装的。每一个NdefMessage中,包含了1个或多个android.nfc.NdefRecord对象。NdefRecord是表示NDEF格式数据的基本单元,它包含类型信息、唯一的标志信息以及需要传输的数据。界面组件可以从NFC标志中读取或写入NdefMessage对象。

官方链接:http://developer.android.com/reference/android/nfc/package-summary.html
文档下载链接:http://download.csdn.net/detail/klcf0220/5893925
代码下载链接:http://download.csdn.net/detail/klcf0220/5893933

Android网络通信(7):NFC的更多相关文章

  1. Android – 学习操作NFC – 2

    在<Android – 学习操作NFC – 1>说明了Android在处理NFC tag的机制.tag dispatch system的运作流程,以及三种ACTION_NDEF_DISCO ...

  2. 移动支付之智能IC卡与Android手机进行NFC通信

    本文来自http://blog.csdn.net/hellogv/ .引用必须注明出处.        眼下常见的智能IC卡执行着JavaCard虚拟机.智能IC卡上能够执行由精简后的Java语言编写 ...

  3. Android网络通信(8):WiFi Direct

    Android网络通信之WiFi Direct 使用Wi-Fi Direct技术可以让具备硬件支持的设备在没有中间接入点的情况下进行直接互联.Android 4.0(API版本14)及以后的系统都提供 ...

  4. Android近场通信---NFC基础(一)(转)

    转自 http://blog.csdn.net/think_soft/article/details/8169483 本文译自:http://developer.android.com/guide/t ...

  5. Android 网络通信之Socket

    Android 网络通信之Socket 应用软件的网络通信无非就是Socket和HTTP,其中Socket又可以用TCP和UDP,HTTP的话就衍生出很多方式,基础的HTTP GET和POST请求,然 ...

  6. Android近场通信---NFC基础转)

    Android近场通信---NFC基础(一)(转) 本文介绍在Android系通过你所能执行的基本任务。它解释了如何用NDEF消息格式来发送和接收NFC数据,并且介绍了支持这些功能的Android框架 ...

  7. [转载]android网络通信解析

    原文地址:android网络通信解析作者:clunyes 网络编程的目的就是直接戒间接地通过网络协议不其他计算机进行通讯. 网络编程中有两个主要的问题, 一个是如何准确的定位网络上一台戒多台指主机: ...

  8. Android 网络通信API的选择和实现实例

    Android开发网络通信一开始的时候使用的是AsyncTask封装HttpClient,没有使用原生的HttpURLConnection就跳到了Volley,随着OkHttp的流行又开始迁移到OkH ...

  9. Android 网络通信框架Volley简介

    1.1. Volley引入的背景在以前,我们可能面临如下很多麻烦的问题. 比如以前从网上下载图片的步骤可能是这样的流程: 在ListAdapter#getView()里开始图像的读取. 通过Async ...

随机推荐

  1. (转)Spring文件上传,包括一次选中多个文件

    背景: http://www.cnblogs.com/lixuwu/p/8495275.html已经实现了单文件的上传和下载,多文件的上传是另一种情景,这里记录下来 实现过程 先说前台. 运行以后就是 ...

  2. csp20160904解题报告

    dijkstra+贪心 每次加一个到起始点(首都)距离最小的点. 然后加边,这个最小点必然通过一条边和已加入的某个点相连,在这个最小点与已加入的点相连的边中,选取最短的一条边加入. 证明如下: 前提: ...

  3. spring MVC 如何接收前台传入的JSON对象数组

    spring MVC 如何接收前台传入的JSON对象数组 主要方法: (主要用到的包是 net.sf.json  即:json-lib-2.3-jdk15.jar 完整相关jar包: commons- ...

  4. SURF算法

    一.原理: Sift算法的优点是特征稳定,对旋转.尺度变换.亮度保持不变性,对视角变换.噪声也有一定程度的稳定性:缺点是实时性不高,并且对于边缘光滑目标的特征点提取能力较弱. Surf(Speeded ...

  5. 编译Uboot——错误记录

    我使用的是ZLG的EasyARM i.MX280A的开发板.官方提供的编译器时arm-fsl-linux-gnueabihf(gcc 4.4.4).自己尝试使用arm-linaro-linux-gnu ...

  6. JS基本包装类型之三(String)

    1. 基本数据类型和基本包装类型 这里以字符串类型来讲解基本数据类型和基本包装类型. JS中存在基本数据类型String(typeof返回"string"), 也存在基本包装数据类 ...

  7. promise用法详解

    es6的promise可谓是异步书写的一大福音,过去异步js书写是函数嵌套函数的方式,promise出现后书写异步js代码就变得美观得多了 以前的写法:回调函数不停嵌套 ajax('/banners' ...

  8. go函数练习

    1.编写程序,在终端输出九九乘法表. package main import ( "fmt" ) func main() { for i := 1; i <= 9; i++ ...

  9. IP地址分类以及子网划分

    五类IP地址段 根据上表的说明,我们可以知道: 你只要知道 IP 的第一个十进制数,就能够约略了解到该 IP 属于哪一个等级, 以及同网域 IP 数量有多少. 这也是为啥我们上头选了 192.168. ...

  10. VxWorks Fuzzing 之道:VxWorks 工控实时操作系统漏洞挖掘调试与利用揭秘

    转载:freebuf 0×00 前言 关于VxWorks,这里引用44CON议题<攻击 VxWorks:从石器时代到星际>探究 一文章中的介绍: VxWorks 是世界上使用最广泛的一种在 ...