MockLocation testProvider не вызывает onLocationChanged

Я нацелен на Google API 2.3.3 и имею следующий тестовый класс

import android.content.Context; import android.location.Criteria; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.location.LocationProvider; import android.os.Bundle; import android.provider.Settings; import android.test.AndroidTestCase; import android.util.Log; public class MockLocationManagerTests extends AndroidTestCase implements LocationListener{ private static final String TAG = "MockLocationTests"; private String locationProvider = "TestProvider"; private LocationManager locationManager; private Location lastLocation; protected void setUp() throws Exception { super.setUp(); locationManager = (LocationManager) getContext().getSystemService(Context.LOCATION_SERVICE); if (Settings.Secure.getInt(getContext().getContentResolver(), Settings.Secure.ALLOW_MOCK_LOCATION, 0) == 0) { fail("Mock location must be enabled"); } setupLocationManager(); } private void setupLocationManager() { if (locationManager.getProvider(locationProvider) != null) { locationManager.removeTestProvider(locationProvider); } locationManager.addTestProvider(locationProvider, false, true, false, false, false, false, false, Criteria.POWER_LOW, Criteria.ACCURACY_FINE); locationManager.requestLocationUpdates(locationProvider, 0, 0, this); locationManager.setTestProviderStatus(locationProvider, LocationProvider.AVAILABLE, null, System.currentTimeMillis()); locationManager.setTestProviderEnabled(locationProvider, true); } private Location createLocation(double lat, double lon) { Location location = new Location(locationProvider); location.setLatitude(lat); location.setLongitude(lon); location.setAltitude(0); location.setTime(System.currentTimeMillis()); return location; } protected void tearDown() throws Exception { super.tearDown(); } public final void testCanObserveLocationChanging() throws InterruptedException { Location l = createLocation(19,-2); locationManager.setTestProviderLocation(locationProvider,l); synchronized(this){ wait(5000); } Location l2 = createLocation(1,-10); locationManager.setTestProviderLocation(locationProvider,l2); synchronized(this){ wait(5000); } assertEquals(l,lastLocation); } public void onLocationChanged(Location location) { Log.i(TAG,"location changed"); lastLocation = location; } public void onProviderDisabled(String provider) { Log.i(TAG, provider+" disabled"); } public void onProviderEnabled(String provider) { Log.i(TAG, provider+" enabled"); } public void onStatusChanged(String provider, int status, Bundle extras) { Log.i(TAG,"status changed: "+provider+" to "+status); } } 

OnLocationChanged не вызывается, и мой google-fu и brain-fu не дают мне возможности. Любые советы были высоко оценены

ОБНОВИТЬ

Ни одно из сообщений журнала не попадает, поэтому onStatusChanged и onProviderEnabled не запускаются?

Если я вызову getLastKnownLocation() между вызовами setTestProviderLocation() locationManager вернет местоположение, которое я установил

ДРУГОЕ ОБНОВЛЕНИЕ

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

Аналогично работает в Google API 19.

AndroidTestCase не настраивает правильный Looper для обработки событий обновления. Вы должны запустить его в качестве тестового действия ActivityInstrumentationTestCase2 или добавить ThreadLooper в AndroidTestCase для работы с сообщениями об обновлении.

 Looper mLooper; HandlerThread thread = new HandlerThread("LocationHandlerThread"); thread.start(); // starts the thread. mLooper = thread.getLooper(); 

Затем используйте новый Looper в методе requestLocationUpdates:

 mLocationManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 0, 0, mLocationListener, mLooper); 

Вы включили ложные местоположения на своем телефоне или эмуляторе? Для этого есть настройки для приложений / разработки / макетов.

Просто нажмите «Отправить» на вкладке управления эмулятором затмения, чтобы отправить координаты в приложение. Введите описание изображения здесь