Android mock location

为什么80%的码农都做不了架构师?>>>   hot3.png

1. Mock Location 简介

借助 mock location, 在测试LBS应用时不必进行路测就可以生成位置数据。 总的来说,使用 mock location 有以下好处:

  • 可以生成特定的模拟数据而不必真的移动物理设备
  • 模拟数据同样来自 location service,可以测试到应用中位置相关的代码。另外,是从产品外部发送模拟数据,产品代码中不会编写一些在发布前必须删除或关闭的测试代码
  • 不必移动物理设备所以可以在模拟器上测试产品

Android 官方文档 中给出了详细的操作步骤。但文档中的实现是基于 Google Play services 的。 对于没有安装 Google Play services 的设备,文档中提供的方法是不可行。

2. Mock Location 实现

参考一些技术博客, 发现不基于 Google Play services 也可以很方便地实现 mock location。总结如下

首先要确保打开设备的 mock location 开关 (2.3上 设置 - 应用程序 - 开发 - 允许模拟位置, 4.0上 设置 - 开发 - 允许模拟位置)

在 AndroidManifest.xml 中需要声明以下这个不太常用的权限:


此外还需要GPS权限 ACCESS_FINE_LOCATION

核心代码如下:

mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
mLocationManager.addTestProvider(LocationManager.GPS_PROVIDER, false,
		false, false, false, true, true, true, 0, /* magic */5);
mLocationManager.setTestProviderEnabled(LocationManager.GPS_PROVIDER,
		true);

Location loc = Utils.createLocation(35 + i * unit, 117 + i
		* unit, 50.f);
loc.setTime(System.currentTimeMillis());
mLocationManager.setTestProviderLocation(LocationManager.GPS_PROVIDER, loc);

Utils类定义如下:

public class Utils {
    private static final String PROVIDER = "gps";
    private static final double LAT = 37.377166;
    private static final double LNG = -122.086966;
    private static final float ACCURACY = 3.0f;
    /*
     * From input arguments, create a single Location with provider set to
     * "flp"
     */
    public static Location createLocation(double lat, double lng, float accuracy) {
        // Create a new Location
        Location newLocation = new Location(PROVIDER);
        newLocation.setLatitude(lat);
        newLocation.setLongitude(lng);
        newLocation.setAccuracy(accuracy);
        return newLocation;
    }
    // Example of creating a new Location from test data
    public static final Location testLocation = createLocation(LAT, LNG, ACCURACY);
}

3. Mock Location 实现

Android 官方文档 中给出的最佳实践如下:

  • 从一个独立的 mock location provider app 中发送模拟数据
  • mock location provider app 是从运行在 started service 中的后台线程发送数据的。所以即使 app 进入后台,仍然可以发送模拟数据,且不用担心阻塞 UI 线程。

参考

android mock location on device

转载于:https://my.oschina.net/apm/blog/224330

你可能感兴趣的:(Android mock location)