目前我正在通过模拟文件中的一些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);
}
答案 0 :(得分:0)
您需要实施LocationManager
和LocationListener
来获取手机的当前位置,然后在stopMockingLocation
方法中使用该位置。您的代码中已经有LocationManager
,但作为参考,可以找到有关如何设置此回调系统的文档here和here。
基本上,您将配置LocationManager
以从无线NETWORK_PROVIDER
或GPS_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
内调用其他方法,但我无法进行推荐,因为我不确定你要做什么。