golf - Probando GPS en Android
golf pad tags (6)
¿Cómo pruebas las aplicaciones de GPS en Android ? ¿Podemos probarlo utilizando el emulador de Android ?
En los controles extendidos de su emulador (haga clic en "..." en la barra de control junto a su emulador) está la pestaña Ubicación, donde puede ingresar manualmente ubicaciones individuales (latitud / longitud / altitud) y enviarlas a la zona virtual. dispositivo, o configure la reproducción de datos GPS a una velocidad deseada desde un GPX o un archivo KML que pueda importar.
Edición: es el emulador de Android predeterminado del que estoy hablando.
Le sugiero que escriba la prueba que está enviando el objeto de ubicación a la clase de oyente que desea probar. Con esto en mente, necesitará algunos métodos de ayuda que podrán producir objetos de ubicación.
P.ej:
Primero envíe una ubicación con coordenadas fijas (por ejemplo, el centro de Nueva York).
// prueba si todo está bien
A continuación, envía una coordenada que está a 100 metros de la primera coordenada. Puede hacer esto con la función que implementé recientemente: https://.com/a/17545955/322791
// prueba si todo está bien
Es común que los métodos de GPS estén relacionados con el tiempo. Le sugiero que implemente el método getNow () en la clase de oyente y que lo llame cuando necesite la hora actual.
long getNow() {
if (isUnitTesting) {
return unitTestTime;
} else {
System.getcurrenttimemillis();
}
}
En el entorno de prueba de unidad, simplemente configure obj.isUnitTesting = true y obj.unitTestTime en el momento que desee. Después de eso, puede enviar la primera ubicación al oyente, luego cambia la hora (+ x segundos) y envía otra ubicación ...
Será mucho más fácil probar tu aplicación de esa manera.
Sí.
Si desarrolla utilizando el complemento Eclipse ADT, abra la perspectiva DDMS después de iniciar el emulador y busque la vista Control de emulador. Hay una sección de controles de ubicación que le permite enviar archivos de coordenadas de latitud y longitud fija, o GPX (formato de intercambio de GPS) o KML (Keyhole Markup Language) si desea enviar varias coordenadas a intervalos regulares (para simular el viaje en una ruta específica) .
Alternativamente, puede simplemente enviar un telnet al emulador y usar el comando geo desde la línea de comandos, que admite coordenadas de latitud y longitud fijas, así como también oraciones 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
Tal vez quieras usar una prueba de unidad, así que puedes 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 requerido para AndroidManifest.xml:
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
además del código de Mallox, esta es la combinación de ubicación simulada, además de la ubicación real de gps: 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