setTestProviderLocation() не запускает вызов onLocationChanged()
Я пытаюсь заставить этот кусок кода работать:
Проблема в том, что когда я запускаю тест, 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()
,