У LocationManager в Android есть 3 провайдера, но когда мой LocationManager также показывает MOCK_PROVIDER - PullRequest
0 голосов
/ 27 ноября 2018

Я занимаюсь разработкой приложения для 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();
}
...