转载地址: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"/>
最后, 你需要允许 mock locations在设备的 Settings > Developer options >Allow mock locations.
关掉 伪装位置
这个很重要如果你要在发布版本中伪装位置提供者,一个很好的方法就是允许位置提供者只在应用处于测试模式中。在你的代码中,检查测试标记是否设置
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
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow