2011-11-28 11 views
5

jestem kierowania Google API 2.3.3 i mają następujące klasy testowejMockLocation testProvider nie wymaga onLocationChanged

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 nie jest wywoływana i moje google-fu-fu i mózg zawodzi mnie. Wszelkie porady mile widziana

UPDATE

żaden z komunikatów dziennika zostały złowione tak onStatusChanged i onProviderEnabled nie strzelają?

Jeśli zadzwonię getLastKnownLocation() pomiędzy wywołaniami setTestProviderLocation() locationManager zwraca lokalizację Mam ustawiony

Kolejna aktualizacja

Jeśli dodać klasę, która wykorzystuje ten kod do mojej aplikacji następnie onLocationChanged() jest nazywa. Jedyna różnica polega na tym, że nie używam Mock_Location. Wygląda więc na to, że metoda setTestProviderLocation() nie wywołuje metody onLocationChanged() w celu uruchomienia usługi

+0

Czy używasz emulatora lub telefon? Nie widzę też niczego złego. Zakładam, że dodałeś uprawnienie do ' ' pozwolenie – Reno

+0

To jest za pomocą emulatora i tak, ustawiono próbne pozwolenie na lokalizację. –

Odpowiedz

0

Czy włączyłeś fałszywe lokalizacje na telefonie lub emulatorze? Jest to ustawienie w aplikacjach/projektach rozwojowych/symulacyjnych.

+0

Jest włączony tak. Myślę, że jest to błąd z setTestProviderLocation nie wywołanie onLocationChanged jako dokładnie tej samej klasy, która jest w trakcie testu działa w emulatorze. Nie działa "tylko", gdy jest uruchamiany z testu. –

-1

Wystarczy kliknąć "Wyślij" na karcie sterowania emulatora w punkcie zaćmienia, aby wysłać współrzędne do aplikacji. enter image description here

+1

Próbuję skonfigurować * zautomatyzowane * testowanie. Odtąd ruszyłem do roboty i roboguiki, więc nigdy tak naprawdę tego nie rozwiązałem –

1

Zachowuje się tak samo w Google API 19.

AndroidTestCase nie setup właściwego Looper do obsługi zdarzeń aktualizacji. Musisz uruchomić go jako działanie testowe ActivityInstrumentationTestCase2 lub dodać ThreadLooper do AndroidTestCase, aby poradzić sobie z wiadomościami aktualizacyjnymi.

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

Następnie użyj nowego Looper w metodzie requestLocationUpdates:

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