首页 > 代码库 > 【Android Developers Training】 108. 使用模拟定位进行测试
【Android Developers Training】 108. 使用模拟定位进行测试
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好。
原文链接:http://developer.android.com/training/location/location-testing.html
样例代码:
LocationProvider.zip
要测试一个使用定位服务的地点认知应用,你不需要将你的设备从一个地方移动到另一个地方来生成数据。你可以将定位服务放到测试模式中。在该模式中你可以发送测试的Location对象到定位服务中,然后它会发送给定位客户端。在测试模式下,定位服务也可以使用测试Location对象来激活地理围栏。
使用测试位置有如下几个好处:
- 测试位置允许你创建一个特定的测试数据,而不是通过移动设备获取一些近似的数据。
- 由于测试位置来自于定位服务,他们测试你的定位代码的每一个部分。另外,由于你可以将测试数据和你的应用时分离的,所以在你发布应用的时候,不需要移除你的测试代码。
- 由于你不需要通过移动设备来产生测试数据,所以你可以使用模拟器进行测试。
最佳的使用测试位置的方法是从一个另外的测试位置提供应用发出。这节课包含了一个你可以下载并使用的提供器应用,你可以使用它来测试你的应用。你可以根据你的需求恰当地更新提供器应用。相关的内容将会在后续章节中讲解。
这节课剩余的部分将会展示如何启动测试模式,并使用一个定位客户端将测试位置发送给定位服务。
Note:
测试位置对定位服务在行为认知上所使用的算法是没有影响的。要了解有关行为认知方面的知识,可以阅读:Recognizing the User‘s Current Activity(博客链接:http://www.cnblogs.com/jdneo/p/3758479.html)
一). 打开测试模式
要在测试模式下将测试位置发送给定位服务,一个测试应用必须请求ACCESS_MOCK_LOCATION权限。另外,你必须使用“Enable mock locations”选项启用测试设备上的测试位置。要学习如何在设备上启用测试位置,可以阅读:Setting up a Device for Development。
要打开定位服务的测试模式,首先将一个定位客户端连接到定位服务,这在Retrieving the Current Location(博客链接:http://www.cnblogs.com/jdneo/p/3713826.html)中已经讲解过。然后调用LocationClient.setMockMode(true)。一旦你调用了这个方法,定位服务会关闭它的内部定位提供器,并仅发送你所提供的测试位置。下面的代码片段展示了如何调用LocationClient.setMockMode(true):
// Define a LocationClient object public LocationClient mLocationClient; ... // Connect to Location Services mLocationClient.connect(); ... // When the location client is connected, set mock mode mLocationClinet.setMockMode(true);
一旦你将定位客户端连接到了定位服务上,你必须保持连接直到你完成了测试位置的发送。一旦你调用了LocationClient.disconnect(),定位服务会重新回到它的内部定位提供器上。如果你要在定位客户端正在连接的状态下关闭测试模式,需要调用LocationClient.setMockMode(false)。
二). 发送测试位置
一旦你设置了测试模式,你可以创建测试Location对象并将它们发送至定位服务。之后,定位服务会将这些测试Location对象发送给已连接的定位客户端。定位服务也会使用测试Location对象来控制地理围栏的激活。
要创建一个新的测试Location,我们使用你的测试数据创建一个新的Location对象。把提供器的值设置为“flp”,定位服务会把它放到发出的Location对象中。下面的代码片段展示了如何创建一个新的测试Location:
private static final String PROVIDER = "flp"; private static final double LAT = 37.377166; private static final double LNG = -122.086966; private static final float ACCURACY = 3.0f; ... /* * From input arguments, create a single Location with provider set to * "flp" */ public Location createLocation(double lat, double lng, float accuracy) { // Create a new Location Location newLocation = new Location(PROVIDER); newLocation.setLatitude(lat); newLocation.setLongitude(lng); newLocation.setAccuracy(accuracy); return newLocation; } ... // Example of creating a new Location from test data Location testLocation = createLocation(LAT, LNG, ACCURACY);
在测试模式下,调用LocationClient.setMockLocation()将一个测试位置发送给定位服务。例如:
mLocationClient.setMockLocation(testLocation);
定位服务会设置该测试位置作为当前的位置,且该地点会作为下一个更新的地点发出。如果这一新的测试位置穿越了一个地理围栏,那么定位服务会激活该地理围栏。
三). 运行测试位置提供器应用
本节会包含一个测试位置提供器应用的简短概述(可在最上面的连接下载),并对你应该如何使用该应用进行测试进行一些指导。
概述
本课程中涉及的测试位置提供器应用,会从后台一个运行了已启动的Service的线程中,将测试位置发送给定位服务。通过使用一个已启动的服务,提供器应用可以一直保持运行,即使应用的主Activity由于配置的变更或者其它系统事件而被销毁。通过使用后台线程,可以让该服务执行一个长期的测试任务而不会阻塞UI线程。
当你打开提供器应用后,启动的Activity允许你将测试参数发送给Service,并控制你希望测试的类型。涉及到下列选项:
测试前暂停
在提供器应用将测试数据发送给定位服务前需要等待的时间。这一间隔可以允许你在测试开始前,有时间从提供器应用切换到要测试的应用。
发送间隔
提供器应用将测试数据发送给定位服务时的中间间隔。在后面的章节会进一步说道该选项。
单次执行
即从普通模式切换到测试模式,执行一次测试数据,之后再切换回普通模式,并杀掉Service。
连续执行
即从普通模式切换到测试模式,无限地执行测试数据,之后再切换回普通模式,后台线程以及已启动的Service会一直执行,甚至主Activity已经被销毁。
停止测试
如果一个连续测试正在执行中,该选项会停止它;否则,会返回一个警告消息。启动的Service会从测试模式切换到普通模式,然后将其自身中止。同时后台线程也会被中止。
除了上述选项之外,提供器应用还具有两种显示状态:
应用状态
显示提供器应用相关的生命周期状态信息。
连接状态
显示连接到客户端的连接状态信息。
由于已启动的Service正在运行,所以它还会推送测试状态的通知。这些通知允许你即使应用不在前台也可以观察状态的更新情况。当你点击了一个通知,提供器应用的主Activity会回到前台。
使用测试位置提供器应用进行测试
要测试来自测试位置提供器应用的测试位置数据:
在一个装有Google Play服务的设备上安装测试位置提供器。定位服务是Google Play服务的一部分。
在设备上,启用测试位置。要学习怎么做,可以查看:Setting up a Device for Development。
从启动器开始提供器应用,然后在主界面上选择模式。
除非你移除了启动暂停,不然的话,测试位置提供器应用会暂停一些时间,然后开始将测试数据发送给定位服务。
运行你想要测试的应用。当测试位置提供器应用在运行时,你正在测试的应用汇接收测试位置而不是真实的位置。
如果提供器应用是在处于连续测试的中间,你可以通过点击“Stop test”切换回真实地点。这会强制已启动的Service关闭测试模式并且将其自身停止。当服务停止后,后台线程也被销毁了。
四). 有关测试的建议
下面的章节包含了创建测试数据以及使用测试位置提供器应用提供的数据这两方面的建议。
选择一个发送间隔
每一个让定位服务发送位置的测试位置提供器都有它自己的最小更新间隔。例如,GPS提供器无法以每秒更新一次的频率发送地理位置更新。,而Wi-Fi定位的频率上限则是5秒一次。对于真实的位置,这些周期是会被自动处理的,但你需要再发送测试位置的时候为它们进行计数。例如,你不应该以超过一秒一次的频率发送测试位置。如果你在测试室内的位置(更多地依赖于Wi-Fi),那么你使用的频率应该是五秒一次。
仿真移动速度
要仿真一个实际设备的速度,可以缩短或者延长连续两个位置之间的距离。例如,可以每秒移动88英尺来模拟汽车的行驶,因为这相当于每小时60英里。相对而言,每秒1.5英尺的变化可以仿真快不行走,这相当于每小时3英里。
计算位置数据
通过搜索网络,你可以发现找到很多计算起始位置经纬度与结束位置经纬度之间距离的小程序,以及计算两点经纬度之间距离所用的公式。另外Location类提供了两个方法来计算两点之间距离。
distanceBetween()
一个静态方法,根据经纬度来计算两点之间的距离。
distanceTo()
对一个给定的Location,返回到另一个Location的距离。
地理围栏测试
当你对一个由地理围栏检测功能的应用进行测试时,使用的测试数据应该能够反映不同形式的行动方式,如:行走,骑车,驾驶,火车等。对于慢速的行动模式,可以让两点间的距离变化较小。对应的,对于快速地行动模式,可以让两点间的距离大一些。
管理测试数据
这节课所包含的测试位置提供器应用可以以常量的形式测试经纬度以及精度。你可以考虑其他测试数据的组织形式:
XML:
可以将位置数据存储于测试位置提供器应用中对应的XML文件中,这样可以将测试数据与代码分离,方便测试。
从服务器下载:
将位置数据存储于服务器中,并让提供器应用下载。由于数据和应用完全分离,所以你可以修改测试数据而不用重新构建应用。你也可以通过修改服务器上的测试数据,并让结果立即反应到你正在测试的测试位置中。
记录的数据
除了设想一些测试数据外,你还可以写一个工具应用,它记录你移动设备过程中的位置数据。并将这些数据作为测试数据,或利用这些数据帮助你构造一些测试数据。例如,你可以在行走的过程中记录一些数据,然后创建一些测试数据,这些数据会随着时间的变化而发生相应的变化。