android模拟器开发和测试nfc应用实例详解

从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

(0)

相关推荐

  • 使用adb命令向Android模拟器中导入通讯录联系人的方法

    本文实例讲述了使用adb命令向Android模拟器中导入通讯录联系人的方法.分享给大家供大家参考.具体实现方法如下: 使用adb提供的命令, 可以非常方便地从PC中将通讯录导入android模拟器中. 首先要先准备好固定格式的contacts.vcf文件, 该文件即android中的通讯录存储文件. 格式如下: 复制代码 代码如下: BEGIN:VCARD  VERSION:3.0  N:15200000000;;;;  TEL;TYPE=cell:15200000000  END:VCARD 

  • Intel HAXM为Android 模拟器加速解决模拟器运行慢的问题

    Android 模拟器一直以运行速度慢著称, 本文介绍使用 Intel HAXM 技术为 Android 模拟器加速, 使模拟器运行度媲美真机, 彻底解决模拟器运行慢的问题. Intel HAXM (Hardware Accelerated Execution Manager) 使用基于 Intel(R) Virtualization Technology (VT) 的硬件加速, 因此需要 CPU 支持 VT , 而且仅限于 Intel CPU, 与 AMD CPU 无缘, Intel HAXM

  • Android 模拟器(emulator-5554...)出现错误解决办法

    Android 模拟器 出现错误解决办法: 1.Unable to get view server version from device exlipse下编写好android应用程序时候,右键项目 run as android application 弹出一对话框说出现问题 点击详细说 空指针异常.打开ddms模式, 里面提示 Unable to get view server version from device emulator-5554 ,此时我的android模拟器是运行着的. 解决

  • 配置一个好用的Android模拟器让你不再对模拟器那么失望

    默认情况下的Android模拟器就是下面的这个样子: 看到这个屏幕截图最显眼的问题显然它的丑陋的界面.模拟器窗口占据了屏幕巨大的空间,而且毫无缘由的放着一个屏幕键盘. 如果你没亲自用过模拟器的话,还有一个不易发现的问题:几乎是慢到不能用!为了拍上面的图花了5分钟才把模拟器启动起来,而且几乎对输入事件没响应.有3个原因可以解释这个问题:   1.非本地化的.默认使用ARM架构的模拟器,尽管将指令转化成x86的也是可行的,但这个转换过程是非常慢的. 2.非加速的.即使你选择了x86,虚拟硬件加速也不

  • 二个android模拟器互发短信程序演示

    一.创建 Android工程 Project name:SendMessage BuildTarget:Android2.2 Application name:发送短信 Package name:com.sms.Activity Create Activity:SendMessage Min SDK Version:8 二.编辑工程 1.编辑字符串strings.xml文件内容为: 复制代码 代码如下: <?xml version="1.0" encoding="utf

  • Android开发应用第一步 安装及配置模拟器Genymotion

    一.安装及配置Genymotion (1)由于Eclipse中自带的SDK模拟器,启动之慢,不说了 现在给大家介绍一种比较快的模拟器Genymotion (2)首先去Genymotion的官网注册一个账号,这个账号是有用的 请记着你的账号和密码(我用的是QQ好注册的) 网址是:https://www.genymotion.com/ (3)填好信息之后 点击 Creat account 即可注册  然后到你的邮箱激活 就好了! (4)下载之后直接点击安装就好了!安装过程不再细讲!只要默认的就好了!

  • Android启动模拟器报错解决方法

    Android模拟器报"Failed To Allocate memory 8"错误的解决办法 Android在启动模拟器AVD时,出现下面的异常:"Failed to allocate memory: 8",怎么办? 此错误是我们在允许AVD时,选择了默认的AVD插件所致. 解决方法:减少分配的内存大小.修改AVD的配置文件,将选项"hw.ramSize=1024"从1024改为256.如图所示:

  • 在Android模拟器上模拟GPS功能总是null的解决方法

    我们都知道,在我们开发时需要在模拟器上模拟GPS,可在Location的时候总是null,上网查了一下,发现如下解决: 网上大侠的解决方案: 在模拟器上获取GPS信息时,使用Location loc = LocationManager.getLastKnownLocation("gps");来获取location信息,但是往往在调试中loc是null的,因为首先需要在模拟器中手动添加GPS信息,有两种手动添加方法 1.在eclipse下,windows-->open perspe

  • Android模拟器中窗口截图存成文件实现思路及代码

    Android模拟器内容是用OpenGL渲染的,所以用一般的编程截图(如PrintWindow()等)会是黑屏.这是因为画的东西放在framebuffer里. 一种方法是通过adb把guest的framebuffer数据/dev/graphics/fb0倒到host,再转为图片.但这样速度比较慢. 好在Android模拟器中把guest的framebuffer传到host进行显示,所以在host端只要将framebuffer输出到文件即可. 首先定义每次framebuffer更新时的回调函数:

  • Android模拟器对应的电脑快捷键说明

    Home键(小房子键) 在键盘上映射的就是home键,这倒是很好记. Menu键 用于打开菜单的按键,在键盘上映射的是F2键,PgUp键同样可以.另外,看英文原文的意思,貌似这个键在某些机型上会被设计为左软件(left softkey) Start键 这个键在模拟器和G1真机上我都没有找到到底是哪个键.映射的是Shift+F2或PgDn,某些机型会被设计为右软键(right softkey). Back键 返回键,用户返回上一个UI或者退出当前程序.键盘上映射ESC键. Call/Dial键(电

  • WAC启动Android模拟器 transfer error: Read-only file system错误解决方法

    这两天在用WAC SDK开发Widget时,在启动Android模拟器时Eclipse的Consle出现如下错误: 复制代码 代码如下: [2011-11-27 22:08:49 - ddms]transfer error: Read-only file system 然后Widget无法安装和执行!在参考了官方论坛上的相同问题的一个帖子后,也没有实质的解决办法(主要是楼主不厚道,解决了也不说明如何解决).另外,根据管理员的提示,发现也无法解决问题,相应的两个帖子的地址如下: 开发人员的提问:h

随机推荐