setTestProviderLocation() не запускает вызов onLocationChanged()

Я пытаюсь заставить этот кусок кода работать:

Тестирование GPS в Android

Проблема в том, что когда я запускаю тест, onLocationChanged() никогда не вызывается:

public class LocationTest0 extends AndroidTestCase implements LocationListener {
private Location received = null;
public void testExample() {
    LocationManager lm = (LocationManager)this.getContext().getSystemService(Context.LOCATION_SERVICE);
    String testProvider = "Test";

    if (null == lm.getProvider(testProvider)){
        lm.addTestProvider(testProvider, false, false, false, false, false, false, false, Criteria.POWER_LOW, Criteria.ACCURACY_FINE);
    }

    lm.setTestProviderEnabled(testProvider, true);
    lm.requestLocationUpdates(testProvider, 0, 0, this);
    lm.setTestProviderStatus(testProvider, LocationProvider.AVAILABLE, null, System.currentTimeMillis());

    Location location = new Location(testProvider);
    location.setLatitude(1.0);
    location.setLongitude(2.0);
    location.setTime(System.currentTimeMillis());
    lm.setTestProviderLocation(testProvider, location);

    Assert.assertFalse("Received Location is null", received == null );

    lm.removeTestProvider(testProvider);
}
@Override
public void onLocationChanged(Location location) {
    received = location;
    Log.d("LocationTest0", "onLocationChanged CALLED");
    // Never gets called
}

5 ответов

Решение

Это то, что сработало для меня

locationManager.addTestProvider(mocLocationProvider, false, false,
                    false, false, true, true, true, 0, 5);
locationManager.setTestProviderEnabled(mocLocationProvider, true);

,

Location mockLocation = new Location(mocLocationProvider); // a string
mockLocation.setLatitude(location.getLatitude());  // double 
mockLocation.setLongitude(location.getLongitude()); 
mockLocation.setAltitude(location.getAltitude()); 
mockLocation.setTime(System.currentTimeMillis()); 
locationManager.setTestProviderLocation( mocLocationProvider, mockLocation); 

,

<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION">

Также в настройках телефона Android убедитесь, что у вас установлен флажок "Разрешить фиктивные местоположения"

У меня была та же проблема, и я мог заставить ее работать. Я поделюсь этим здесь в случае, если это может помочь кому-либо еще.

Важно учитывать, что любой вызов setTestProviderLocation будет вызывать любого слушателя, зарегистрированного на фиктивных провайдерах во время вызова. Так что если вы позвоните setTestProviderLocation и сразу после этого звонка requestLocationUpdates, onLocationChanged обратный вызов никогда не вызывается.

Моя проблема была в том, что у меня были эти два (setTestProviderLocation а также requestLocationUpdates) в двух разных темах и requestLocationUpdates был вызван после, так что я так и не получил обратный вызов onLocationChanged, Если ваша программа многопоточная (что весьма вероятно), убедитесь, что setTestProviderLocation называется после requestLocationUpdates,

Также я заметил для любого звонка setTestProviderLocation, onLocationChanged будет вызван один раз (приблизительно). Так что вы можете положить setTestProviderLocation в цикле, чтобы смоделировать серию вызовов onLocationChanged, Таким образом, вы также можете смоделировать путь.

У меня такая же проблема. Не удалось решить, и, наконец, я сдался и добавил вызов onLocationChanged( location) после locationManager.setTestProviderEnabled( PROVIDER, location) вручную. Это не красиво, но работает.

Я столкнулся с подобной проблемой. Независимо от того, что я пытался, я никогда не мог получить onLocationChanged() для автоматического вызова. В конце концов я отказался и создал метод, который одновременно устанавливает местоположение с помощью setTestProviderLocation() и напрямую вызывает onLocationChanged(). Это не идеальное решение, но оно сработало для моих нужд.

После добавления и включения вашего провайдера просто используйте эту строку для получения обновлений:
locationManager.requestLocationUpdates(MOCK_PROVIDER, 0, 0, this);

Я рекомендую использовать такой метод при запуске деятельности:

    private void enableProvider() {
        
        try {
            locationManager.addTestProvider(
                    MOCK_PROVIDER,
                    false,
                    false,
                    false,
                    false,
                    true,
                    true,
                    true,
                    0,
                    5
            );
        } catch (IllegalArgumentException | SecurityException e) {
            Log.w(TAG, "addTestProvider" + e.getMessage());
        }
        try {
            locationManager.setTestProviderEnabled(MOCK_PROVIDER, true);
            locationManager.requestLocationUpdates(MOCK_PROVIDER, 0, 0, this); <-- Update Request
        } catch (IllegalArgumentException | SecurityException e) {
            Log.w(TAG, "setTestProviderEnabled" + e.getMessage());
        }
    }

Также обрабатывайте исключения.

У меня та же проблема с этой проблемой, я думаю, что проблема в TestProvider, поэтому я установил

String mocLocationProvider= LocationManager.NETWORK_PROVIDER;

и тогда он может позвонить onLocationChanged(),

Другие вопросы по тегам