从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目录中),该应用会发送一个ActivityAction,该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;@Overrideprotected 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标签中@Overridepublic 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三个回调方法。

http://

题4

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

下载地址

2013 CSDN博客之星评选

用Android模拟器也可以开发和测试NFC应用相关推荐

  1. android 模拟器 xposd,xposed开发入门向之入门前准备工作 模拟器安装xposed框架

    本帖最后由 永恒陌 于 2019-12-20 15:15 编辑 2019-12-20: 这个模拟器的系统是自带root的.可以依葫芦画瓢在别的模拟器上装. ---------------------- ...

  2. fiddler 只监听模拟器_利用Fiddler对Android模拟器网络请求进行抓包【转】

    在Android的开发调试过程中,特别是针对网络编程的情况,很多时候我们希望能够对Android的网络请求进行抓包,用来定位以及分析我们程序的问题.下面我介绍使用Fiddler对Android模拟器的 ...

  3. Android模拟器的判定

    Android模拟器的判定 开发当中,有时需要判断当前设备是否为模拟器.一般判断的方法是通过匹配Build.MODEL, Build.MANUFACTURER, 属性"ro.hardware ...

  4. mac下的android模拟器吗,Mac怎么安装Andriod模拟器 Mac怎么安装安卓模拟器

    Mac上怎么安装 Andriod 系统模拟器?有的朋友可能需要在自己用的 Mac 电脑上安装Andriod 系统模拟器,用于开发或测试一些安卓软件.下面PC6苹果网小编给大家简单介绍下怎么在 Mac ...

  5. 软件测试/测试开发 | app测试中常用的Android模拟器

    公众号搜索:TestingStudio 霍格沃兹的干货都很硬核 测试 Android app 的时候,Android 模拟器是经常会用到的工具.模拟器可以轻松的模拟不同的品牌.分辨率和 Android ...

  6. 前端开发使用的 安卓模拟器_7个最佳的Android模拟器

    Android是使用最为广泛的开源手机操作系统,在全球有超过十亿的Android设备被激活--我们需要在这些设备进行实验,来确保应用程序的安全性和可用性.在Google Play Store中提供了1 ...

  7. android外接手机模拟器,HBuilderX 连接网易mumu手机模拟器进行App开发

    1.下载安装手机模拟器 常见的安卓手机模拟器: 手机模拟器名称对应端口号 夜神模拟器 62001 天天模拟器 6555 海马玩模拟器 26944 逍遥模拟器 21503 网易mumu模拟器 7555 ...

  8. Android 开发、测试工具资源汇总

    Android Tools Android SDK在线更新镜像服务器 中国科学院开源协会镜像站地址: IPV4/IPV6: http://mirrors.opencas.cn 端口:80 IPV4/I ...

  9. Android模拟器下重力感应应用的开发-Simulator的使用

         近段时间,一直在做一个关于重力感应的问题,涉及到手机的重力感应,开始一直用真机进行测试的,结果测试了很久,发现并不如人意,一直没有达到效果,鉴于使用真机,连线啊什么的比较麻烦,因此,笔者准备 ...

  10. app测试中常用的Android模拟器

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

最新文章

  1. 3d 行为树编辑器_cocos creator主程入门教程——有限状态机和行为树
  2. Java的Socket通信----通过 Socket 实现 TCP 编程之多线程demo(2)
  3. Spring mvc 内置编码过滤器原理解析
  4. 在Action类中获得HttpServletResponse对象的四种方法
  5. python转换函数使用_python进制转换函数代码的使用
  6. P2387-[NOI2014]魔法森林【LCT】
  7. git maven 发布_Maven Git发布
  8. 替代JavaOne 2013
  9. 服务器无法拖动文件复制文件,​IT服务器运维:艾锑人为您整理Win10系统下移动、复制、删除文件需要管理员权限的解决方法...
  10. Linux实时监控日志文件的swatchdog
  11. FFmpeg学习(4)——为视频嵌入字幕
  12. 灰色系统预测matlab代码,灰色预测MATLAB代码
  13. 一周搞定scrapy之3,将爬取到的起点中文网信息保存到mysql
  14. 使用python Telegram 机器人推送消息
  15. Extreme DAX中文第1章 商业智能中的DAX
  16. epiphone真伪
  17. 机器人在gazebo中使用四轮差速仿真模型时,转向不明显?
  18. 生命如歌-五年级每日一记
  19. 为什么硬盘在macbook上无法编辑?mac不能往移动硬盘拷东西
  20. 云服务案例分析 BB平台 Quiz3

热门文章

  1. 社区版PyCharm(PyCharm Community)也可以有可视化的数据库工具呀
  2. idea 设置重复代码检测
  3. 【C语言】九九乘法口诀表
  4. CSDN 的 Markdown 编辑器语法
  5. 软件项目开发报价指南
  6. 阿里巴巴Java开发手册(华山版)
  7. 使用MySQL8.0以上版本和MySQL驱动包8.0以上出现的问题
  8. Audio Driver 架构
  9. C语言基础入门(经典收藏)
  10. java zk_zk框架:zul文件,纯Java或混合更好的性能