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
Czy używasz emulatora lub telefon? Nie widzę też niczego złego. Zakładam, że dodałeś uprawnienie do ' ' pozwolenie –
Reno
To jest za pomocą emulatora i tak, ustawiono próbne pozwolenie na lokalizację. –