当前位置: 首页 > 工具软件 > data_location > 使用案例 >

Android中的ACCESS_MOCK_LOCATION权限使用Demo

秦涵涤
2023-12-01

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

 类似资料: