从Android2.3开始支持NFC。不过NFC应用只能在Android手机(或平板电脑)上测试和开发,而且Android手机还必须有NFC芯 片。而且如果测试NFC传输文件时至少需要两部支持NFC的手机。当然,如果测试读写NFC标签,还需要一些NFC标签或帖子。而且NFC在模拟器上时不 能运行的。所以从这一点来说,NFC开发需要更多的设备,比较麻烦。这也蓝牙、传感器是一样的。都不能在Android模拟器上开发和测试。真不知道 Google为什么不解决这一问题。

不过这种问题也不是不能解决,而且并不复杂。既然模拟器没有提供这样的功能。我们可以将NFC功能模拟出来(实际上,蓝牙、传感器都可以进行模拟,可能很 多读者用过一些传感器模拟软件,NFC模拟和这个类似)。而且要求是与真实的NFC环境无缝对接。也就是说,使用模拟NFC功能开发的Android应用 可以不需要修改一行代码,甚至不需要重新编译,就可以直接用在真实的NFC环境。

那么怎么解决这个问题呢?要想知道如何模拟NFC,需要先从宏观上了解NFC的工作原理。这里用NFC标签作为例子。NFC数据传输和这个类似。当NFC 标签靠近手机时,Android系统中有一个叫Nfc的系统应用(在<Android源代码根目录>/pakcages/apps/Nfc目 录中),该应用会发送一个Activity Action,该Action会调用一个在系统中注册的用于处理NFC请求的窗口(如果没有,就调用Nfc应用中默认的处理窗口)。这里的关键是 Activity Action。既然Nfc应用会发出一个Activity Action,那么用于模拟NFC的程序,也发送一个Activity Action,不就可以共享用于处理NFC请求的窗口(由用户建立的Activity)了吗?只要在发送Activity Action时加一个标志,就可以区分是Activity Action是Nfc系统应用发出的,还是模拟NFC的程序发出的。这样在处理请求的NFC窗口中就可以根据不同的情况进行处理。为了更透明,可以编写一 个Activity类(如NFCActivity),该类根据这两种情况进行处理。又因为不管是哪种情况,都需要提供写入NFC标签的数据,或接收NFC 标签中的数据。所以可以在该NFCActivity中提供一些回调方法,当需要提供或接收数据时,调用这些方法即可。最后需要使用NFC功能时,用户自己 编写的窗口类只需要从NFCActivity类继承,并实现相应的回调方法即可。例如,下面就是一个实现方法,可接收NFC标签的数据,并写入新数据。

public class NFCManTestActivity extends NFCActivity
{
private NFCMan mNfcMan;
private EditText nfcTagText;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_nfcman_test);
nfcTagText = (EditText) findViewById(R.id.edittext_nfc);
mNfcMan = new NFCMan(this);
}
// 当NFC标签靠近手机时调用,data用于接收NFC标签中的数据,
// 返回值会重新写到NFC标签中
@Override
public String onNear(NFCData data)
{
// 返回要写入NFC标签的文本
return nfcTagText.getText().toString();
}
// 将数据成功写入NFC标签后会调用该方法
@Override
public void onNFCSuccess()
{
// 显示成功写入数据的提示
Toast.makeText(this, "成功写入数据", Toast.LENGTH_LONG).show();
}
// 写入数据失败后调用该方法
@Override
public void onNFCFailed(int error, String errorMsg)
{
// 显示写入数据异常的编码和信息
Toast.makeText(this, "error:" + error + "\n" + "msg:" + errorMsg,
Toast.LENGTH_LONG).show();
}
}

从NFCManTestActivity类的代码可以看出,共有如下三个回调方法。分别处理读写NFC标签数据,写入成功和写入失败三个事件。

onNear

onNFCSuccess

onNFCFailed

从这一点可以看出,完全隐藏了NFC的影子。下面用图1描述一下这个NFC模拟系统的原理。

图1  NFC模拟器的实现原理

从图1可以看出,需要有一套虚拟的NFC标签,这些是在PC上用软件模拟的。对于虚拟NFC标签,通过Socket与安装在NFC设备中的模拟NFC处理 程序进行交互,然后该程序会发送Broadcast Action,最后接收到这个Broadcast后,会继续调用Activity Action调用处理NFC请求的窗口。这一点与Nfc系统程序一样,只不过中间多了一个发送broadcast的过程。因为模拟NFC处理程序与处理 NFC请求的NFCActivity所在的Library是分离的,只能通过Broadcast进行通知。而Nfc系统程序是通过NFC驱动感知真实 NFC标签是否靠近的。而对于处理NFC请求的窗口来说,不管是虚拟的NFC标签,还是真实的NFC标签,都处理同一个Activity Action。所以处理NFC请求的Activity可以共用一套代码。

我将这个模拟NFC的应用称为NFCMan(NFC侠),下面看一下该应用如何模拟NFC标签,模拟界面如图2所示。

图2 NFC模拟器主界面

在图2中上面是模拟的NFC设备。只要Android手机(不需要支持NFC)或Android模拟器上运行的模拟NFC的应用(如图3所示)根据图2中右下角的IP连接到NFC模拟器,就会显示一个手机图标。

图3
        
图2的下面是虚拟的NFC标签,点击右下角的“新建NFC标签”可以建立新的NFC标签。双击NFC标签会显示该标签的信息,如图4所示。这些信息包括标
签名称、最大容量、标签内容(默认是空)。只要将虚拟NFC标签拖动到上面的虚拟NFC设备,就相当于将NFC标签靠近了该设备。然后会通过Socket
将相应的数据传到图3所示的Android应用。接着该应用会发送Broadcast。最后接收到该Broadcast的Android应用会通过
Activity
Action调用处理NFC请求的Activity。会根据情况调用onNear、onNFCSuccess、onNFCFailed三个回调方法。

图4

这个程序是我开发的一个开源项目,名称是NFCMan。如果读者想了解完整的实现过程,可以参阅《Android开发权威指南 第2版》第45章(最后一章)的内容。近期会将该项目上传到gifhub上。如果需要源代码的读者,可以到如下地址下载(ch45中)。

下载地址

 
 
 

用Android模拟器也可以开发和测试NFC应用的更多相关文章

  1. 利用Fiddler对Android模拟器网络请求进行抓包

    安装使用Fiddler 下载安装Fiddler的方法这里就略过了,一路Next就行了.装好之后运行软件,正常情况这个时候我们已经可以对电脑的网络请求进行抓包了.Fiddler默认的代理地址是127.0 ...

  2. 微软发布独立Android模拟器 为开发者提供测试

    微软发布了 Visual Studio 2015 正式版,除了免费的社交版之外,另外也有付费的专业版.这套工具除了提供 Windows 应用程序的整合环境之外,你也可以利用它来开发 Android 程 ...

  3. 技术分享 | app测试中常用的Android模拟器

    原文链接 Emulator Emualor 是 Android Studio 自带的模拟器,是官方提供的工具,Android 开发最常使用的就是这一款. 它功能非常齐全,电话本.通话等功能都可正常使用 ...

  4. 第三方Android 模拟器流畅速度快,适合开发人员

    “工欲善其事,必先利其器.” 使用Android模拟器开发和调试应用肯定比使用真机方便.但相比XCODE的IOS模拟器,Android SDK自带的AVD实在不争气,不过一些第三方的模拟器却表现不俗! ...

  5. 手机开发Android模拟器genymotion

    手机开发的时候总会碰到一个问题,eclipse插件自带的android模拟器太慢了. 根据网络上有人推荐使用genymotion模拟器.   主要的操作步骤如下: 1.在genymotion网站注册账 ...

  6. Android开发中遇到的问题(一)——Android模拟器端口被占用问题的解决办法

    一.问题描述 今天在Eclipse中运行Android项目时遇到"The connection to adb is down, and a severe error has occured& ...

  7. Eclipse+Android开发:Android模拟器快捷键

    Android模拟器快捷键:          按键 按键作用  Home  Home key  Home键  ESC  Back Key  后退键  F1  Menu key  菜单键  F2  S ...

  8. win10的react native 开发环境搭建,使用Android模拟器

    1.打开cmd的管理员模式,win+X,选择命令提示符(管理员)即可,运行如下命令: @"%SystemRoot%\System32\WindowsPowerShell\v1.0\power ...

  9. Android 开发 关于APP无法安装到Android模拟器上的问题

    我们在创建一个app后,打算安装到Android模拟器上.可能会出现无法安装,或者提示已经安装无法卸载的问题.这个时候需要添加兼容CPU. 选择 build.gradle 文件打开添加如下代码: an ...

随机推荐

  1. XXX项目总结

    前言 昨天晚上睡不着总感觉有些什么东西需要记下来,所以就有了这篇文章.做了好几次的重构是应该有一个总结以备以后查阅,当然有些设计思想是通过自己的总结也有些是吸收别人的思想,同样如果能对你有所帮助那就再 ...

  2. 可在广域网部署运行的QQ高仿版 -- GG2014 完美版!新增支持:聊天记录、好友分组、托盘闪动消息提醒、登录状态、GIF动态表情

    距上次GG V3.7版本(可在广域网部署运行的QQ高仿版 -- GG叽叽V3.7,优化视频聊天.控制更多相关细节)的发布,已经有50天了,这50天对于GG来说,是一个重大的飞跃.因为这段时间通过一些基 ...

  3. 从 Android 静音看正确的查bug的姿势?

    0.写在前面 没抢到小马哥的红包,无心回家了,回公司写篇文章安慰下自己TT..话说年关难过,bug多多,时间久了难免头昏脑热,不辨朝暮,难识乾坤...艾玛,扯远了,话说谁没踩过坑,可视大家都是如何从坑 ...

  4. ENode 1.0 - 消息的重试机制的设计思路

    项目开源地址:https://github.com/tangxuehua/enode 上一篇文章,简单介绍了enode框架中消息队列的设计思路,本文介绍一下enode框架中关系消息的重试机制的设计思路 ...

  5. 《IO 系统性能》笔记

    近期项目中涉及和别人谈存储架构及选型,将IOPS相关的内容学习下.参考网上资料<IO 系统性能之一:衡量性能的几个指标> 1. 基本概念 1)读写IO操作:对应磁盘的存数据.取数据: 2) ...

  6. 那些年使用Hive踩过的坑

    1.概述 这个标题也是用血的教训换来的,希望对刚进入hive圈的童鞋和正在hive圈爬坑的童鞋有所帮助.打算分以下几个部分去描述: Hive的结构 Hive的基本操作 Hive Select Hive ...

  7. angular controller as syntax vs scope

    今天要和大家分享的是angular从1.2版本开始带来了新语法Controller as.再次之前我们对于angular在view上的绑定都必须使用直接的scope对象,对于controller来说我 ...

  8. FusionCharts简单教程(六)-----如何自定义图表上的工具提示

          所谓图表上的工具提示就是当鼠标放在某个特定的数据块上时所显示的提示信息.如下: 禁用显示工具提示       在默认情况下工具提示功能是显示的,但是有时候我们并不是很想需要这个功能提示功能 ...

  9. C#对七牛云的操作

    1.配置环境 项目中引用 QiNiu.4.0.dll 在webconfig:<add key="USER_AGENT" value="qiniu csharp-sd ...

  10. JavaScript语法、对话框。分支语句

    一.用法 其所在的位置有三块,1.head里面  2.body里面  3.</html>后   一般都写在</html>后 其用法为<script></scr ...