【Android Developers Training】 108. 使用模拟定位进行测试
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好。
原文链接:http://developer.android.com/training/location/location-testing.html
样例代码:
要测试一个使用定位服务的地点认知应用,你不需要将你的设备从一个地方移动到另一个地方来生成数据。你可以将定位服务放到测试模式中。在该模式中你可以发送测试的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类提供了两个方法来计算两点之间距离。
一个静态方法,根据经纬度来计算两点之间的距离。
对一个给定的Location,返回到另一个Location的距离。
地理围栏测试
当你对一个由地理围栏检测功能的应用进行测试时,使用的测试数据应该能够反映不同形式的行动方式,如:行走,骑车,驾驶,火车等。对于慢速的行动模式,可以让两点间的距离变化较小。对应的,对于快速地行动模式,可以让两点间的距离大一些。
管理测试数据
这节课所包含的测试位置提供器应用可以以常量的形式测试经纬度以及精度。你可以考虑其他测试数据的组织形式:
XML:
可以将位置数据存储于测试位置提供器应用中对应的XML文件中,这样可以将测试数据与代码分离,方便测试。
从服务器下载:
将位置数据存储于服务器中,并让提供器应用下载。由于数据和应用完全分离,所以你可以修改测试数据而不用重新构建应用。你也可以通过修改服务器上的测试数据,并让结果立即反应到你正在测试的测试位置中。
记录的数据
除了设想一些测试数据外,你还可以写一个工具应用,它记录你移动设备过程中的位置数据。并将这些数据作为测试数据,或利用这些数据帮助你构造一些测试数据。例如,你可以在行走的过程中记录一些数据,然后创建一些测试数据,这些数据会随着时间的变化而发生相应的变化。
【Android Developers Training】 108. 使用模拟定位进行测试的更多相关文章
- 【Android Developers Training】 102. 序言:让你的应用获知地点
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 2. 运行你的应用
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 1. 创建一个Android项目工程
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 91. 解决云储存冲突
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 89. 最大化的使用谷歌云消息(Google Cloud Messaging)
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 13. 支持不同平台版本
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 58. 缓存位图
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 42. 从另一台设备接收文件
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 41. 向另一台设备发送文件
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
随机推荐
- MyEclipse修改项目名称后,部署到tomcat问题。
1.问题描述: 修改项目名称后,部署到tomcat server,部署出来的文件夹名还是旧的名称. 2.解决方案: 光把项目重命名是不够的,还要修改一下Myeclipse里面的配置. a). 工程名- ...
- docker安装hadoop集群
docker安装hadoop集群?图啥呢?不图啥,就是图好玩.本篇博客主要是来教大家如何搭建一个docker的hadoop集群.不要问 为什么我要做这么无聊的事情,答案你也许知道,因为没有女票.... ...
- three.js粒子效果(分别基于CPU&GPU实现)
前段时间做了一个基于CPU和GPU对比的粒子效果丢在学习WebGL的群里,技术上没有多作讲解,有同学反馈看不太懂GPU版本,干脆开一篇文章,重点讲解基于GPU开发的版本. 一.概况 废话不多说,先丢上 ...
- 一步步学习EF Core(3.EF Core2.0路线图)
前言 这几天一直在研究EF Core的官方文档,暂时没有发现什么比较新的和EF6.x差距比较大的东西. 不过我倒是发现了EF Core的路线图更新了,下面我们就来看看 今天我们来看看最新的EF Cor ...
- md5加密解析
MD5加密算法解析 知识库连接: http://baike.baidu.com/view/7636.htm http://baike.baidu.com/subview/350813/7544439. ...
- Bash Scripting Learn Notes
References: [1] http://www.tldp.org/LDP/Bash-Beginners-Guide/html/ 1. Executing programs from a scri ...
- Windows Server 2016中,安装PHP Manager,ARR3.0或者URL Rewrite 2.0无法成功的解决办法
如图: 无法安装原因都是这几个工具无法识别10.0这个版本,可以修改注册表来先完成安装,然后再改回去 PHPManager的修改方法如下: 打开注册表工具(运行Regedt32),找到:HKEY_LO ...
- 虚拟机kali找不到无线网卡、搜不到无线网络
VitualBox虚拟机下刚装好kali系统后,使用无线网卡,在主机上插一块usb无线网卡,然后进入虚拟机系统会发现无线网卡刚开始还能扫描出周围的无线网路, 过一会就搜不到了,显示无网络,输入命令iw ...
- iOS-创建自己的日志系统
今天说说怎么创建自己的日志系统 先看下Xcode自己的日志(这里说的NSLog) 系统自带的NSLog打印的信息只有简单的 时间 / 项目名称 / 打印内容 内容比较简单, 很难做分类管理和写入文件 ...
- c++概括
c++到底是什么样的语言 在过去的几十年,计算机技术的发展令人吃惊,当前的笔记本电脑的计算速度和存储信息的能力超过了20世纪60年代的大型机.20世纪七十年代,C和Pascal语言引领人们进入结构化编 ...