模拟Android的LocationProvider

时间:2013-03-14 15:03:38

标签: android testing gps mocking

目前我正在通过模拟文件中的一些GPS数据来测试我的Android应用程序的LocationProvider,以暂时模拟真实设备上的移动。此外,我想动态地从我的模拟数据切换到实际数据。以下代码适用于模拟从文件读取的GPS数据。但是,当我试图停止模拟GPS数据时,我的当前位置卡在文件的最后读取GPS信号上。

因为我不想更改我的实际Android应用程序的代码,所以我在与名称GPS_Provider关联的LocationProvider中编写我的模拟数据。基于位置的应用程序可以通过简单地调用`requestLocationUpdates(LocationManager.GPS_Provider,)来读取模拟数据。棘手的部分是重置GPS LocationProvider以便再次提供真实数据。在这里,我卡住了,不知道如何重新设置它。

    private AssetManager assetManager;
    private LocationManager locationManager;

    private String locationProviderName = LocationManager.GPS_Provider;

    private List<Location> allMockedPositions;

    private Handler handler;
    private int position;

    private Runnable runner = new Runnable() {

        @Override
        public void run() {
            if (position <= allMockedPositions.size()) {    
                Location mockedLocation = allMockedPositions.get(position++);
                locationManager.setTestProviderLocation(locationProviderName, mockedLocation);
                handler.postDelayed(runner, 500);
            }
        }
    };

    public MockLocationProvider(Context context) {
        assetManager = context.getAssets();
        locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    }

    public void startMockingLocation(Route route) {
        allMockedPositions = LocationData.getRouteData(assetManager, route, locationProviderName);
        startMocking();
    }

    private void startMocking() {       
        position = 0;
        handler = new Handler();
        handler.post(runner);
    }

    public void stopMockingLocation() {
        locationManager.clearTestProviderLocation(locationProviderName);
        stopMocking();
    }

    private void stopMocking() {
        handler.removeCallbacks(runner);
    }

1 个答案:

答案 0 :(得分:0)

您需要实施LocationManagerLocationListener来获取手机的当前位置,然后在stopMockingLocation方法中使用该位置。您的代码中已经有LocationManager,但作为参考,可以找到有关如何设置此回调系统的文档herehere

基本上,您将配置LocationManager以从无线NETWORK_PROVIDERGPS_PROVDER获取更新。然后,如果在指定参数内存在已注册的更改,则会将新位置信息提供给LocationListener(您可以设置更改将在其中注册的时间和距离范围)。

最后,在您的LocationListener中,您会看到onLocationChanged

的方法
private final LocationListener listener = new LocationListener() {      
    @Override     
    public void onLocationChanged(Location location) {         
    // A new location update is received.  Do something useful with it.           
    }     
};  

当手机的位置在您定义的时间和距离参数内发生变化时,这就是所谓的内容。如果您想要做的就是在停止模拟后获取用户的位置,您可以简单地创建一个实例变量,将用户位置存储在onLocationChanged方法中的该变量中,然后从{{}}中访问该位置{1}}方法。或者你也可以在stopMockingLocation内调用其他方法,但我无法进行推荐,因为我不确定你要做什么。