欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2022-06-29 09:30:41
从android2.3开始支持nfc。不过nfc应用只能在android手机(或平板电脑)上测试和开发,而且android手机还必须有nfc芯 片。而且如果测试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模拟系统的原理。

android模拟器开发和测试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所示。

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

图2 nfc模拟器主界面

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

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

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

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

                                                          图4