Android中的ACCESS_MOCK_LOCATION权限使用Demo

来源:互联网 发布:达内大数据培训多少钱 编辑:程序博客网 时间:2024/06/03 04:07

转载地址: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 1
原创粉丝点击