0

目前我正在通过模拟文件中的一些 GPS 数据来测试我的 android 应用程序的 LocationProvider,以便临时模拟真实设备上的运动。另外,我想即时从我的模拟数据切换到真实数据。以下代码适用于模拟从文件读取的 GPS 数据。但是,当我尝试停止模拟 GPS 数据时,我当前的位置会卡在文件中最后读取的 GPS 信号上。

因为我不想更改我的实际 android 应用程序的代码,所以我将我的模拟数据写入与 name 关联的 LocationProvider 中GPS_Provider。基于位置的应用程序可以通过简单地调用 `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);
    }
4

1 回答 1

0

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

基本上,您将配置您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,然后从您的stopMockingLocation方法内访问该位置。或者,您可以从内部调用其他方法,onLocationChanged但我无法提出建议,因为我不确定您到底要做什么。

于 2013-03-14T15:44:50.353 回答