Android中的ACCESS MOCK LOCATION权限使用Demo

本文介绍了如何在Android中使用ACCESS MOCK LOCATION权限进行测试,通过创建MockLocationProvider类来模拟位置数据,绕过DDMS的限制,允许在真机或使用网络位置提供者时进行测试。同时,文章强调了需要设置相应的安全权限,并提供了关闭模拟位置的建议,以确保在发布版本中的正确行为。
摘要由CSDN通过智能技术生成
               

转载地址: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值