MockLocation testProvider не вызывает onLocationChanged - PullRequest
5 голосов
/ 28 ноября 2011

Я нацеливаюсь на 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 меня подводят. Любой совет с благодарностью

UPDATE

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

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

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

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

Ответы [ 3 ]

1 голос
/ 05 ноября 2014

Так же ведет себя в 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);
0 голосов
/ 13 октября 2012

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

0 голосов
/ 03 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...