2011-11-28 15 views
5

estoy de orientación de Google API 2.3.3 y tienen la siguiente clase de pruebaMockLocation testProvider no llama 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 no está siendo llamado y mi google-fu-fu y el cerebro me está fallando. Cualquier consejo muy apreciada

ACTUALIZACIÓN

ninguno de los mensajes de registro se captura de manera OnStatusChanged y onProviderEnabled no están disparando?

Si llamo getLastKnownLocation() entre llamadas a la setTestProviderLocation() locationManager devuelve la ubicación He puesto

otra actualización

Si añado la clase que utiliza este código para mi solicitud luego onLocationChanged() se llamado. La única diferencia es que no estoy usando Mock_Location. Parece que setTestProviderLocation() no está causando que onLocationChanged() se active

+0

¿Está usando el emulador o un teléfono? Yo tampoco veo nada malo. Supongo que ha agregado el permiso ' ' – Reno

+0

Esto está usando el emulador y sí, ha establecido el permiso Mock location. –

Respuesta

0

¿Ha habilitado las ubicaciones simuladas en su teléfono o emulador? Hay una configuración para esto en aplicaciones/desarrollo/ubicaciones simuladas.

+0

Está habilitado yep. Estoy pensando que esto es un error con setTestProviderLocation que no llama a LocationChanged ya que la misma clase que está bajo prueba funciona cuando está en el emulador. Solo 'no funciona' cuando se ejecuta desde una prueba. –

-1

Simplemente haga clic en "Enviar" en la pestaña de control del emulador del eclipse para enviar las coordenadas a la aplicación. enter image description here

+1

Estoy intentando configurar pruebas * automáticas *. Desde entonces, pasé a usar robolectric y roboguice, así que nunca resolví esto –

1

Se comporta igual que en Google API 19.

El AndroidTestCase no lo hace un looper configuración adecuada para el manejo de los eventos de actualización. Debe ejecutarlo como una actividad de prueba ActivityInstrumentationTestCase2 o agregar un ThreadLooper a AndroidTestCase para tratar los mensajes de actualización.

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

A continuación, utilice la nueva Looper en el método requestLocationUpdates:

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