Android中的ACCESS_MOCK_LOCATION权限使用Demo

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
testbed_register_mock是testbed测试框架提供的函数之一,用于给指定的函数注册一个指定的模拟函数,以便在测试过程替换原有的函数实现。 testbed_register_mock函数的定义如下: ```c void testbed_register_mock(void* function_ptr, void* mock_ptr); ``` 其,function_ptr参数是指定的函数指针,mock_ptr参数是指定的模拟函数指针。 testbed_register_mock函数的作用是将指定的函数指针替换为指定的模拟函数指针。在测试用例,当调用指定函数时,实际执行的是模拟函数。模拟函数可以实现自定义的逻辑,例如返回指定的值、记录调用信息等。 通常,在测试用例之前,我们会使用testbed_register_mock函数注册模拟函数,并在测试用例之后使用testbed_unregister_mock函数取消注册。这样可以确保在测试过程只有指定的函数被替换,不影响其他测试用例和函数的正常执行。 下面是一个简单的例子,展示如何使用testbed_register_mock函数注册模拟函数: ```c #include <stdio.h> #include <test/testbed.h> // 原有的函数实现 int my_add(int a, int b) { return a + b; } // 模拟函数实现 int mock_add(int a, int b) { return a * b; } // 在测试用例之前,使用testbed_register_mock注册模拟函数 TEST_SETUP() { testbed_register_mock(my_add, mock_add); } // 编写测试用例,测试函数与其他代码的交互是否正确 TEST(TestCases, test_my_add) { int result = my_add(2, 3); ASSERT_EQ(result, 6); } // 在测试用例之后,使用testbed_unregister_mock取消注册模拟函数 TEST_TEARDOWN() { testbed_unregister_mock(my_add); } ``` 在这个例子,我们定义了一个原有的函数my_add和一个模拟函数mock_add,并在测试用例之前使用testbed_register_mock函数将my_add替换为mock_add。在测试用例,我们调用my_add函数,并检查返回值是否正确。在测试用例之后,我们使用testbed_unregister_mock函数取消注册模拟函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值