zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

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

Android实例测试应用开发 详解 模拟器 nfc
2023-06-13 09:15:14 时间

从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应用中默认的处理窗口)。这里的关键是ActivityAction。既然Nfc应用会发出一个ActivityAction,那么用于模拟NFC的程序,也发送一个ActivityAction,不就可以共享用于处理NFC请求的窗口(由用户建立的Activity)了吗?只要在发送ActivityAction时加一个标志,就可以区分是ActivityAction是Nfc系统应用发出的,还是模拟NFC的程序发出的。这样在处理请求的NFC窗口中就可以根据不同的情况进行处理。为了更透明,可以编写一个Activity类(如NFCActivity),该类根据这两种情况进行处理。又因为不管是哪种情况,都需要提供写入NFC标签的数据,或接收NFC标签中的数据。所以可以在该NFCActivity中提供一些回调方法,当需要提供或接收数据时,调用这些方法即可。最后需要使用NFC功能时,用户自己编写的窗口类只需要从NFCActivity类继承,并实现相应的回调方法即可。例如,下面就是一个实现方法,可接收NFC标签的数据,并写入新数据。

复制代码代码如下:


publicclassNFCManTestActivityextendsNFCActivity
{   
   privateNFCManmNfcMan;
   privateEditTextnfcTagText;
   @Override
   protectedvoidonCreate(BundlesavedInstanceState)
   {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_nfcman_test);
       nfcTagText=(EditText)findViewById(R.id.edittext_nfc);
       mNfcMan=newNFCMan(this);
   }
   // 当NFC标签靠近手机时调用,data用于接收NFC标签中的数据,
   // 返回值会重新写到NFC标签中
   @Override
   publicStringonNear(NFCDatadata)
   {
       // 返回要写入NFC标签的文本
       returnnfcTagText.getText().toString();
   }
   // 将数据成功写入NFC标签后会调用该方法
   @Override
   publicvoidonNFCSuccess() 
   {
       // 显示成功写入数据的提示
       Toast.makeText(this,"成功写入数据",Toast.LENGTH_LONG).show();
   } 
   // 写入数据失败后调用该方法
   @Override
   publicvoidonNFCFailed(interror,StringerrorMsg)
   {
       // 显示写入数据异常的编码和信息
       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处理程序进行交互,然后该程序会发送BroadcastAction,最后接收到这个Broadcast后,会继续调用ActivityAction调用处理NFC请求的窗口。这一点与Nfc系统程序一样,只不过中间多了一个发送broadcast的过程。因为模拟NFC处理程序与处理NFC请求的NFCActivity所在的Library是分离的,只能通过Broadcast进行通知。而Nfc系统程序是通过NFC驱动感知真实NFC标签是否靠近的。而对于处理NFC请求的窗口来说,不管是虚拟的NFC标签,还是真实的NFC标签,都处理同一个ActivityAction。所以处理NFC请求的Activity可以共用一套代码。

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

图2NFC模拟器主界面

      在图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应用会通过ActivityAction调用处理NFC请求的Activity。会根据情况调用onNear、onNFCSuccess、onNFCFailed三个回调方法。

                                                         图4