转载地址:http://mobiarch.wordpress.com/2012/07/17/testing-with-mock-location-data-in-android/
DDMS工具能用来发送模拟位置信息在测试时。但是,他有两个严格的限制:
1.DDMS设置GPS位置为GPS只位置提供者,如果你的应用用网络提供那你就不走运了。
2.DDMS设置位置给虚拟机,你不能用真机来进行测试
如果你需要测试真机或者使用网络位置提供工具,,你将需要开发一个 伪装提供工具在你的应用中。一个伪装提供工具能代表任何位置提供者 - 网络或者GPS。写一个伪装工具很简单。只需要主要移除掉一些特性在发布应用钱
在这片文章中, 我们将会看到怎样创建一个伪装位置工具
第一,我们将开发一个类封装对应的方法细节:
public class MockLocationProvider {
String providerName;
Context ctx;
public MockLocationProvider(String name, Context ctx) {
this.providerName = name;
this.ctx = ctx;
LocationManager lm = (LocationManager) ctx.getSystemService(
Context.LOCATION_SERVICE);
lm.addTestProvider(providerName, false, false, false, false, false,
true, true, 0, 5);
lm.setTestProviderEnabled(providerName, true);
}
public void pushLocation(double lat, double lon) {
LocationManager lm = (LocationManager) ctx.getSystemService(
Context.LOCATION_SERVICE);
Location mockLocation = new Location(providerName);
mockLocation.setLatitude(lat);
mockLocation.setLongitude(lon);
mockLocation.setAltitude(0);
mockLocation.setTime(System.currentTimeMillis());
lm.setTestProviderLocation(providerName, mockLocation);
}
public void shutdown() {
LocationManager lm = (LocationManager) ctx.getSystemService(
Context.LOCATION_SERVICE);
lm.removeTestProvider(providerName);
}
}
o一个简要的MockLocationProvider表述就是
*构造方法名字取自 位置提供工具(Location Provider)。比如,LocationManager.GPS_PROVIDER. addTestProvider() 和 setTestProviderEnabled()声明告诉LocationManager已知Provider将会被伪装数据替换
*pushLocation()方法提供伪装位置信息给一个已知的Provider工具。
任何activity或者Service能很容易的用如下的类。这里,我们能替换网络提供者用一个假的.
public class MainActivity extends Activity {
MockLocationProvider mock;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mock = new MockLocationProvider(LocationManager.NETWORK_PROVIDER, this);
//Set test location
mock.pushLocation(-12.34, 23.45);
LocationManager locMgr = (LocationManager)
getSystemService(LOCATION_SERVICE);
LocationListener lis = new LocationListener() {
public void onLocationChanged(Location location) {
//You will get the mock location
}
//...
};
locMgr.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER, 1000, 1, lis);
}
protected void onDestroy() {
mock.shutdown();
super.onDestroy();
}
}
设置安全性
为了让伪装地址起作用,一些权限是要设置的.
你将会需要两个权限
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
关掉 伪装位置
这个很重要如果你要在发布版本中伪装位置提供者,一个很好的方法就是允许位置提供者只在应用处于测试模式中。在你的代码中,检查测试标记是否设置
if ((getApplication().getApplicationInfo().flags &
ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
mock = new MockLocationProvider(
LocationManager.NETWORK_PROVIDER, this);
//Set test location
mock.pushLocation(-12.34, 23.45);
}
当你测试app用USB 仿真或者用虚拟机时,仿真标记将会被自动设置为true