2009-12-29 23 views

Respuesta

27

Sí.

Si desarrolla utilizando el plug-in de Eclipse ADT, abra la perspectiva DDMS después de lanzar el emulador y buscar el punto de vista de control del emulador. Hay una sección de controles de ubicación que le permite enviar latitud y longitud coordenadas fijas o archivos GPX (GPS Exchange Format) o KML (Keyhole Markup Language) si desea enviar varias coordenadas a intervalos regulares (para simular recorrer una ruta específica) .

Alternativamente, puede simplemente telnet al emulador y utilizar el comando geo desde la línea de comandos, lo que apoya la latitud fija y las coordenadas de longitud, así como sentencias de datos NMEA:

telnet localhost 5554 
geo fix -82.411629 28.054553 
geo nmea $GPGGA,001431.092,0118.2653,N,10351.1359,E,0,00,,-19.6,M,4.1,M,,0000*5B 
+3

¿Qué tal las pruebas en un dispositivo real? ¿Cómo se puede establecer su GEO sobre adb? – fijiaaron

+0

Muchas gracias. Hice muchas investigaciones, ¡y ahora tengo la respuesta! – eav

+0

Hola. Tuve el mismo problema, quería probar en un dispositivo real usando el comando "geo fix", resulta que no es posible de inmediato, así que escribí una aplicación que proporciona esa funcionalidad :) [MockGeoFix] (https: // play .google.com/store/apps/details? id = github.luv.mockgeofix & hl = es) y [código fuente] (https://github.com/luv/mockgeofix/) – luv

3

Quizás this aplicación de prueba o this puede ayudar.

15

Tal vez usted quiere a un uso una prueba de unidad, por lo que puede probar esto:

public class GPSPollingServiceTest extends AndroidTestCase { 
    private LocationManager locationManager; 

    public void testGPS() { 
     LocationManager locationManager = (LocationManager) this.getContext().getSystemService(Context.LOCATION_SERVICE); 
     locationManager.addTestProvider("Test", false, false, false, false, false, false, false, Criteria.POWER_LOW, Criteria.ACCURACY_FINE); 
     locationManager.setTestProviderEnabled("Test", true); 

     // Set up your test 

     Location location = new Location("Test"); 
     location.setLatitude(10.0); 
     location.setLongitude(20.0); 
     locationManager.setTestProviderLocation("Test", location); 

     // Check if your listener reacted the right way 

     locationManager.removeTestProvider("Test"); 
    } 
} 


para que esto funcione también necesita un permiso necesario para la AndroidManifest.xml:

<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> 
+0

Hola, ¿pueden explicarme un poco más? detalla cómo funciona este código. ¿Cómo se probará la actividad que responde a los eventos de ubicación con esto? – Petar

+1

Hola, ha pasado un tiempo, pero veamos si puedo reunir todo de nuevo: Con el LocationManager obtienes el administrador de ubicación GPS del sistema que notifica a tu aplicación los cambios de posición. En la segunda línea, agrega un nuevo proveedor de ubicación. Como va a realizar una prueba unitaria, no tendrá registrado ningún otro proveedor de ubicación. Cuando marqué el comentario "// Configure su prueba", puede inicializar los componentes que desea probar, que deberían estar escuchando los cambios en las posiciones desde el LocationManager. – Mallox

+0

Después de eso, envía una nueva ubicación al administrador de la ubicación y su código que desea probar debe hacer algo con esa información, para que pueda verificar luego si hizo lo correcto. Finalmente, desea eliminar el proveedor de prueba, de modo que no haya varios proveedores de localización para realizar pruebas, si escribe otras pruebas. (aunque junit probablemente lo limpiará correctamente) – Mallox

0

que sugieren que escriba prueba de que está enviando ubicación objeto a la clase oyente que desea probar. Con esto en mente, necesitarás algunos métodos de ayuda que podrán producir objetos de ubicación.

ej .:

Primero le envíe una ubicación con coordenadas fijas (por ejemplo, centro de Nueva York).

// prueba si todo está bien

De lo que envía una coordenada que es appart 100 metros de la primera coordenada. Puede hacer esto con la función I implementado recientemente: https://stackoverflow.com/a/17545955/322791

// prueba si todo está bien

Es común que los métodos GPS están relacionados con el tiempo. Sugiero que implemente el método getNow() en la clase de escucha y que lo llame siempre que necesite la hora actual.

long getNow() { 
    if (isUnitTesting) { 
     return unitTestTime; 
    } else { 
     System.getcurrenttimemillis(); 
    } 
} 

En el entorno de prueba de unidad se establece simplemente el obj.isUnitTesting = true y obj.unitTestTime a cualquier momento que desee. Después de que se puede enviar primera ubicación para el oyente, a continuación, cambia el tiempo (+ x segundos) y enviar otro lugar ...

Será mucho más fácil para probar la aplicación de esa manera.

2

además del código Mallox este es el sulotion de ubicación simuladas, además de la ubicación GPS real: TEST_MOCK_GPS_LOCATION es una cadena

LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    Location location = null; 

    List providers = lm.getAllProviders(); 
    for (Object provider : providers) { 
     if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      return; 
     } 
     Location loc = lm.getLastKnownLocation((String) provider); 
     if (provider.equals(TEST_MOCK_GPS_LOCATION)) { 
      mLastLocation = loc; 
     } 
    } 

en la clase de prueba es:

public class GPSPollingServiceTest extends AndroidTestCase { 
private LocationManager locationManager; 

public void testGPS() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { 
    LocationManager locationManager = (LocationManager) this.getContext().getSystemService(Context.LOCATION_SERVICE); 
    List providers = locationManager.getAllProviders(); 
    if(!providers.contains(TEST_MOCK_GPS_LOCATION)) { 
     locationManager.addTestProvider(TEST_MOCK_GPS_LOCATION, false, false, false, false, false, false, false, Criteria.POWER_LOW, Criteria.ACCURACY_FINE); 
     locationManager.setTestProviderEnabled(TEST_MOCK_GPS_LOCATION, true); 
     // Set up your test 
     Location location = new Location(TEST_MOCK_GPS_LOCATION); 
     location.setLatitude(34.1233400); 
     location.setLongitude(15.6777880); 
     location.setAccuracy(7); 
     location.setTime(8); 
     location.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos()); 

     locationManager.setTestProviderLocation(TEST_MOCK_GPS_LOCATION, location); 

     Method locationJellyBeanFixMethod = Location.class.getMethod("makeComplete"); 
     if (locationJellyBeanFixMethod != null) { 
      locationJellyBeanFixMethod.invoke(location); 
     } 
    } else { 
     // Check if your listener reacted the right way 
     locationManager.removeTestProvider(TEST_MOCK_GPS_LOCATION); 
    } 
} 

}

espero que te ayude

0

En los controles Extendidos de su emulador (haga clic en "..." en la barra de control al lado de su emulador), encontrará la pestaña Ubicación, donde puede ingresar manualmente ubicaciones individuales (latitud/longitud/altitud) y enviarlas al dispositivo virtual, o configure la reproducción de datos GPS a la velocidad deseada desde un archivo GPX o KML que pueda importar.

Edición: es el emulador de Android predeterminado al que me refiero.