Я занимаюсь разработкой приложения для Android на основе определения местоположения.Чтобы протестировать onLocationChanged () интерфейса LocationListener, я создал класс MockLocationProvider, который добавляет провайдер Test с именем MOCK_PROVIDER к экземпляру менеджера расположений.До добавления класса MockLocationProvider в мой код экземпляр диспетчера местоположения показывает только 3 провайдера - GPS, сеть и пассив.Однако, когда я запустил свой код для использования MockLocationProvider, экземпляр диспетчера местоположения показывает 4 провайдера - GPS, Network, Passive и MOCK_PROVIDER.Таким образом, при добавлении провайдера тестирования в экземпляр диспетчера местоположений он генерирует исключение, говоря, что MOCK_PROVIDER уже существует.Я также создал метод завершения работы, который удаляет MOCK_PROVIDER, когда приложение завершается.Я понятия не имею, почему MOCK_PROVIDER все еще существует в моем экземпляре менеджера местоположения.И теперь, даже если я не использую MockLocationProvider, менеджер местоположения по-прежнему показывает 4 провайдеров.Пожалуйста, просветите меня, почему это странное поведение.Я делаю что-то не так?
Ниже приведен фрагмент кода класса MockLocationProvider:
public class MockLocationProvider {
private String providerName;
private Context context;
private LocationManager locationManager;
public MockLocationProvider(LocationManager manager, String name, Context ctx) {
providerName = name;
context = ctx;
locationManager = manager;
for(String provider: locationManager.getAllProviders()) {
System.out.println("provider: " + provider);
}
locationManager.addTestProvider(providerName, false,false, false,
false, true, true, true, 0, 5);
locationManager.setTestProviderEnabled(providerName, true);
}
public void pushLocation(double latitude, double longitude) {
Location mockLocation = new Location(providerName);
mockLocation.setLatitude(latitude);
mockLocation.setLongitude(longitude);
mockLocation.setAltitude(0);
mockLocation.setAccuracy(1);
mockLocation.setElapsedRealtimeNanos(1000);
mockLocation.setTime(System.currentTimeMillis());
locationManager.setTestProviderLocation(providerName, mockLocation);
}
public void shutdown() {
locationManager.clearTestProviderEnabled(providerName);
locationManager.removeTestProvider(providerName);
}
}
Ниже приведен код onDestroy () службы LocationService, который мы должны переопределить:
@Override
public void onDestroy() {
stopForeground(true);
if(mockLocationProvider != null) mockLocationProvider.shutdown();
if(mLocationManager != null && mLocationListener != null){
mLocationManager.removeUpdates(mLocationListener);
}
super.onDestroy();
}