2010-03-27 20 views
131

¿Cómo puedo simular mi ubicación en un dispositivo físico (Nexus One)? Sé que puedes hacer esto con el emulador en el panel de control del emulador, pero esto no funciona para un dispositivo físico.Android simula la ubicación en el dispositivo?

+6

Existen varias aplicaciones en Market que pueden emular la ubicación del GPS. Por ejemplo, "Location spoofer". – Vlad

+0

Para computadoras de escritorio puede crear/instalar controladores que emulen un dispositivo GPS/dispositivo de puerto serie con el propósito de realizar este tipo de prueba. Tal vez podrías crear o encontrar algo similar para Android. – AaronLS

+0

Hay muchas aplicaciones en la tienda que hacen esto ... Puedes probar esto: https://play.google.com/store/apps/details?id=com.yedapps.fakelocation.app.app.fakelocation&hl= es o esto - https://play.google.com/store/apps/details?id=com.fakegps.mock&hl=en – Yehuda

Respuesta

154

Parece que la única forma de hacerlo es utilizar un proveedor de ubicación simulado.

que habilitar las ubicaciones de prueba en el equipo de desarrollo en la configuración y añadir

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

a su manifiesto.

Ahora puede ingresar su código y crear su propio proveedor de ubicación simulada y establecer la ubicación de este proveedor.

+19

enlace roto :(actualización de PLZ –

+80

Hay una aplicación en el mercado llamada "GPS falso". Si habilita las ubicaciones simuladas en su dispositivo, ofrece una buena interfaz gráfica de usuario para establecer su ubicación. Me doy cuenta de que esto no es un hecho -usted mismo solución, pero ciertamente una solución digna para pruebas rápidas. –

+2

[this] (http://pedroassuncao.com/2009/11/android-location-provider-mock/) podría ser el enlace - misma fecha y contenido relevante. – DefenestrationDay

97

Si usa este teléfono solo en el laboratorio de desarrollo, existe la posibilidad de que pueda soldar el chip del GPS y alimentar el puerto serie directamente con secuencias NMEA de otro dispositivo.

+64

¿Por qué los enemigos? Esta respuesta es increíblemente dura. –

+53

Increíblemente duro aunque asombrosamente inútil/irrelevante también. – olivervbk

+13

Aunque es bastante divertido. – etienne

25

Puede utilizar la autorización Servicios de ubicación a ubicación simuladas ...

"android.permission.ACCESS_MOCK_LOCATION"

y luego en el código Java,

// Set location by setting the latitude, longitude and may be the altitude... 
String[] MockLoc = str.split(","); 
Location location = new Location(mocLocationProvider);    
Double lat = Double.valueOf(MockLoc[0]); 
location.setLatitude(lat); 
Double longi = Double.valueOf(MockLoc[1]); 
location.setLongitude(longi); 
Double alti = Double.valueOf(MockLoc[2]); 
location.setAltitude(alti); 
+8

¿cuál es el valor de mocLocationProvider? – Victor

+0

p. Ej. LocationManager.GPS_PROVIDER – enigma969

32

Me gustaría tener mi cable a mano. Sé que usted puede telnet al emulador para cambiar su ubicación

$ telnet localhost 5554 
Android Console: type 'help' for a list of commands 
OK 
geo fix -82.411629 28.054553 
OK 

No puedo recordar si se puede telnet a su dispositivo, pero yo creo que puedas. Espero que esto ayude.

Necesitará adb (puente de depuración de Android) para esto (CLI).

+0

obtiene un permiso denegado a todo lo que envía como un comando a la consola de su dispositivo. Tal vez es posible con una aplicación de terminal, pero creo que requiere acceso raíz – Janusz

+0

Solo para que estemos en la misma página: ¿no estás hablando de "adb shell"? De lo que estoy hablando es diferente, esta es una configuración que te permite establecer parámetros específicos de Android. Sé, por ejemplo, que puede configurar el reenvío de puertos (es decir, localhost: 1234 va al teléfono: 1234) sin acceso de root, por lo que puede configurar un proxy SOCKS y un túnel a través de un cable sin raíz. –

+0

Puede usar adb forward tcp: 6000 tcp: 23 para reenviar el puerto 6000 en su máquina al puerto 23 en el dispositivo, pero no pude conectarlo aunque el puerto esté abierto. El uso de un cliente telnet en el dispositivo y la conexión a localhost también falla – Janusz

21

He tenido éxito con el siguiente código. Aunque me consiguió un único bloqueo por alguna razón (incluso si he probado diferentes pares LatLng), funcionó para mí. mLocationManager es una LocationManager que está conectado a un LocationListener:

private void getMockLocation() 
{ 
    mLocationManager.removeTestProvider(LocationManager.GPS_PROVIDER); 
    mLocationManager.addTestProvider 
    (
     LocationManager.GPS_PROVIDER, 
     "requiresNetwork" == "", 
     "requiresSatellite" == "", 
     "requiresCell" == "", 
     "hasMonetaryCost" == "", 
     "supportsAltitude" == "", 
     "supportsSpeed" == "", 
     "supportsBearing" == "", 

     android.location.Criteria.POWER_LOW, 
     android.location.Criteria.ACCURACY_FINE 
    );  

    Location newLocation = new Location(LocationManager.GPS_PROVIDER); 

    newLocation.setLatitude (/* TODO: Set Some Lat */); 
    newLocation.setLongitude(/* TODO: Set Some Lng */); 

    newLocation.setAccuracy(500); 

    mLocationManager.setTestProviderEnabled 
    (
     LocationManager.GPS_PROVIDER, 
     true 
    ); 

    mLocationManager.setTestProviderStatus 
    (
     LocationManager.GPS_PROVIDER, 
     LocationProvider.AVAILABLE, 
     null, 
     System.currentTimeMillis() 
    );  

    mLocationManager.setTestProviderLocation 
    (
     LocationManager.GPS_PROVIDER, 
     newLocation 
    );  
} 
+1

Bonita publicación, consulte mi respuesta a continuación para las adiciones. – icyerasor

+0

¿Qué es 'setTestProviderStatus'? No veo el propósito ... –

+0

Por lo que recuerdo,' setTestProviderStatus' se usa aquí para notificar/publicar/programar un evento con el LocationManager que el proveedor de GPS ha encontrado una solución "ahora" para que el procesamiento de dicho evento pueda ocurrir. – Dr1Ku

13

Lo Dr1Ku publicado obras. Usó el código hoy pero necesitaba agregar más locs. Aquí hay algunas mejoras:

Opcional: en lugar de utilizar la cadena LocationManager.GPS_PROVIDER, quizás desee definir su propio constate PROVIDER_NAME y usarlo. Al registrarse para actualizaciones de ubicación, elija un proveedor a través de criterios en lugar de especificarlo directamente como una cadena.

Primero: En lugar de llamar removeTestProvider, compruebe primero si hay un proveedor que se retira (para evitar IllegalArgumentException):

if (mLocationManager.getProvider(PROVIDER_NAME) != null) { 
    mLocationManager.removeTestProvider(PROVIDER_NAME); 
} 

Segundo: Para publicar más de un lugar, tiene que ajustar el tiempo de la ubicación:

newLocation.setTime(System.currentTimeMillis()); 
... 
mLocationManager.setTestProviderLocation(PROVIDER_NAME, newLocation); 

Hay también parece ser una prueba de google que utiliza MockLocationProviders: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/android/location/LocationManagerProximityTest.java

Otro buen ejemplo de trabajo se puede encontrar en: http://pedroassuncao.com/blog/2009/11/12/android-location-provider-mock/

Otro buen artículo es: http://ballardhack.wordpress.com/2010/09/23/location-gps-and-automated-testing-on-android/#comment-1358 También encontrará un código que realmente funciona para mí en el emulador.

+0

Sugerencia interesante acerca de la definición de su propio Proveedor, el uso de GPS_PROVIDER es que usted (al parecer) no puede deshacerse del proveedor simulado (más exactamente, no puedes cambiar al GPS normal) hasta que reinicies. Impresionante publicación también, voy a ver las referencias! – Dr1Ku

+0

@ Dr1KU ¿Sigue siendo cierto que no puede volver al GPS normal? ¿Está eso especificado en algún lado? –

+0

@KazDragon Ese era el caso en ese entonces. Por lo que recuerdo, después de encender el 'Mock Provider', el GPS normal no funcionaría, no pude encontrar una solución (estaba probando directamente en un dispositivo). Este puede no ser el caso ya que han pasado muchas cosas en Android desde entonces. – Dr1Ku

6

La solución mencionada por icyerasor y proporcionada por Pedro al http://pedroassuncao.com/blog/2009/11/12/android-location-provider-mock/ funcionó muy bien para mí. Sin embargo, no ofrece soporte para iniciar, detener y reiniciar correctamente el proveedor simulado de GPS.

He cambiado un poco su código y reescrito la clase para que sea una AsyncTask en lugar de un Thread. Esto nos permite comunicarnos con el subproceso UI, para que podamos reiniciar el proveedor en el punto donde estábamos cuando lo detuvimos. Esto es útil cuando cambia la orientación de la pantalla.

El código, junto con un proyecto de ejemplo para Eclipse, se puede encontrar en GitHub: https://github.com/paulhoux/Android-MockProviderGPS

Todo el crédito debe ir a Pedro para hacer la mayor parte del trabajo duro.

8

Existen aplicaciones disponibles en Android Market que le permiten especificar una "Ubicación simulada de GPS" para su dispositivo.

Busqué https://market.android.com y encontré una aplicación llamada "My Fake Location" que me funciona.

El proveedor de Mock GPS mencionado por Paul arriba (en http://www.cowlumbus.nl/forum/MockGpsProvider.zip) es otro ejemplo que incluye código fuente, aunque no pude instalar el APK provisto (dice falla [INSTALL_FAILED_OLDER_SDK] y puede que solo necesite una recompilación)

Para utilizar las ubicaciones simuladas de GPS, debe habilitarlo en la configuración de su dispositivo. Vaya a Configuración -> Aplicaciones -> Desarrollo y marque "Permitir ubicaciones simuladas"

Luego puede usar una aplicación como las descritas arriba para establecer las coordenadas GPS y los mapas de Google y otras aplicaciones usarán la ubicación simulada del GPS que especifique .

+0

ejemplo muy útil. – NullPointerException

+0

El GPS falso es más simple. Me pregunto por qué están pidiendo el identificador de llamadas en el permiso de la aplicación: S –

0

Me pregunto si necesita la configuración elaborada de la ubicación falsa. En mi caso, una vez que obtuve una ubicación de reparación llamé a una función para hacer algo con esa nueva ubicación. En un temporizador crea una ubicación simulada. Y llame a la función con esa ubicación en su lugar. Sabiendo todo el tiempo que en poco tiempo, el GPS vendría con una ubicación actual real. Lo cual está bien. Si tiene el tiempo de actualización establecido lo suficientemente largo.

1

Si su dispositivo está conectado a su computadora y está tratando de cambiar el envío de cables de GPS a través del control Emulator, no funcionará.
Este es un control EMULATOR por una razón.
Solo configúralo para mantenerte al día sobre el cambio de GPS.

lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 

    ll = new LocationListener() {   
     public void onLocationChanged(Location location) { 
      // Called when a new location is found by the network location provider. 
      onGPSLocationChanged(location); 
     } 

     public void onStatusChanged(String provider, int status, Bundle extras) {  
      bigInfo.setText("Changed "+ status); 
     } 

     public void onProviderEnabled(String provider) { 
      bigInfo.setText("Enabled "+ provider); 
     } 

     public void onProviderDisabled(String provider) { 
      bigInfo.setText("Disabled "+ provider); 
     } 
     }; 

Cuando se actualiza el GPS, vuelva a escribir el siguiente método para hacer lo que quiera;

public void onGPSLocationChanged(Location location){ 
if(location != null){ 
    double pLong = location.getLongitude(); 
    double pLat = location.getLatitude(); 
    textLat.setText(Double.toString(pLat)); 
    textLong.setText(Double.toString(pLong)); 
    if(autoSave){ 
     saveGPS(); 
     } 
    } 
} 

no se olvide de poner éstos en la aplicación GPS falso manifiesta
android.permission.ACCESS_FINE_LOCATION
android.permission.ACCESS_MOCK_LOCATION

3

de Google Play hizo el truco para mí. Solo asegúrate de leer todas las instrucciones en la descripción de la aplicación. Debe desactivar otros servicios de ubicación, así como iniciar su aplicación después de habilitar "GPS falso". Funcionó muy bien para lo que necesitaba.

Aquí está el enlace a la aplicación en GooglePlay: Fake GPS

7

Esto funcionó para mí (Android Studio):

Desactivar GPS y Wi-Fi seguimiento por teléfono. En Android 5.1.1 y versiones posteriores, selecciona "habilitar ubicaciones simuladas" en Opciones de desarrollador.

Haga una copia de su manifiesto en el directorio src/debug. Agregue el siguiente a la misma (fuera de la etiqueta de "aplicación"):

utiliza permiso-android: name = "android.permission.ACCESS_MOCK_LOCATION"

Establecer un fragmento de mapa llamado "mapa". Incluir el siguiente código en onCreate():

lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
ll = new MyLocationListener(); 
if (lm.getProvider("Test") == null) { 
    lm.addTestProvider("Test", false, false, false, false, false, false, false, 0, 1); 
} 
lm.setTestProviderEnabled("Test", true); 
lm.requestLocationUpdates("Test", 0, 0, ll); 

map.setOnMapClickListener(new GoogleMap.OnMapClickListener() { 
    @Override 
    public void onMapClick(LatLng l) { 
     Location loc = new Location("Test"); 
     loc.setLatitude(l.latitude); 
     loc.setLongitude(l.longitude); 
     loc.setAltitude(0); 
     loc.setAccuracy(10f); 
     loc.setElapsedRealtimeNanos(System.nanoTime()); 
     loc.setTime(System.currentTimeMillis()); 
     lm.setTestProviderLocation("Test", loc); 
    } 
}; 

Tenga en cuenta que puede que tenga que aumentar temporalmente "minSdkVersion" en su archivo Gradle módulo a 17 con el fin de utilizar el método de "setElapsedRealtimeNanos".

Incluir el siguiente código dentro de la clase principal actividad:

private class MyLocationListener implements LocationListener { 
    @Override 
    public void onLocationChanged(Location location) { 
     // do whatever you want, scroll the map, etc. 
    } 
} 

ejecutar su aplicación con AS. En Android 6.0 y superior obtendrá una excepción de seguridad. Ahora vaya a Opciones de desarrollador en Configuración y seleccione "Seleccionar aplicación de ubicación simulada". Seleccione su aplicación de la lista.

Ahora cuando toca en el mapa, onLocationChanged() disparará con las coordenadas de su toque.

Me acabo de dar cuenta de esto, así que ahora no tengo que vagar por el vecindario con teléfonos en mano.

+0

no funciona con Android 6 –

+0

Creo que funciona en Android 6 si pones este código en servicio – Hamza

1

tal vez no es el enfoque 'programador', pero si quieres ahorrar tiempo y obtener la solución de trabajo instantánea intente una de las aplicaciones que se dedican a burlarse de ubicación disponible en Google Play:

Fake GPS Location Spoofer

Mock Locations

Fake GPS location

+1

¿Lo has probado? ¿Funcionaron según lo solicitado en la pregunta? – arekolek

+0

Sí, funcionan exactamente como se solicitó de fábrica. – mklimek

+0

¿Alguna preferencia? ¿O uno los necesita a todos? : P – arekolek

7

He creado un controlador simple que simula una posición de movimiento desde una posición inicial.

iniciarlo en su devolución de llamada conexión:

private final GoogleApiClient.ConnectionCallbacks mConnectionCallbacks = new GoogleApiClient.ConnectionCallbacks() { 
    @Override 
    public void onConnected(Bundle bundle) { 
     if (BuildConfig.USE_MOCK_LOCATION) { 
      LocationServices.FusedLocationApi.setMockMode(mGoogleApiClient, true); 
      new MockLocationMovingHandler(mGoogleApiClient).start(48.873399, 2.342911); 
     } 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 

    } 
}; 

La clase Handler:

private static class MockLocationMovingHandler extends Handler { 

    private final static int SET_MOCK_LOCATION = 0x000001; 
    private final static double STEP_LATITUDE = -0.00005; 
    private final static double STEP_LONGITUDE = 0.00002; 
    private final static long FREQUENCY_MS = 1000; 
    private GoogleApiClient mGoogleApiClient; 
    private double mLatitude; 
    private double mLongitude; 

    public MockLocationMovingHandler(final GoogleApiClient googleApiClient) { 
     super(Looper.getMainLooper()); 
     mGoogleApiClient = googleApiClient; 
    } 

    public void start(final double initLatitude, final double initLongitude) { 
     if (hasMessages(SET_MOCK_LOCATION)) { 
      removeMessages(SET_MOCK_LOCATION); 
     } 
     mLatitude = initLatitude; 
     mLongitude = initLongitude; 
     sendEmptyMessage(SET_MOCK_LOCATION); 
    } 

    public void stop() { 
     if (hasMessages(SET_MOCK_LOCATION)) { 
      removeMessages(SET_MOCK_LOCATION); 
     } 
    } 

    @Override 
    public void handleMessage(Message message) { 
     switch (message.what) { 
      case SET_MOCK_LOCATION: 
       Location location = new Location("network"); 
       location.setLatitude(mLatitude); 
       location.setLongitude(mLongitude); 
       location.setTime(System.currentTimeMillis()); 
       location.setAccuracy(3.0f); 
       location.setElapsedRealtimeNanos(System.nanoTime()); 
       LocationServices.FusedLocationApi.setMockLocation(mGoogleApiClient, location); 

       mLatitude += STEP_LATITUDE; 
       mLongitude += STEP_LONGITUDE; 
       sendEmptyMessageDelayed(SET_MOCK_LOCATION, FREQUENCY_MS); 
       break; 
     } 
    } 
} 

esperan que los pueda ayudar ..

1

Instalar aplicación GPS falso https://play.google.com/store/apps/details?id=com.incorporateapps.fakegps.fre&hl=en

Opciones de desarrollador ->Seleccionar la aplicación de ubicación simulada (Es mala, aplicación de ubicación falsa seleccionada).

aplicación GPS falso:

pestaña doble en el mapa para añadir -> haga clic en el botón de reproducción -> Mostrar la tostada "ubicación falso detuvo"

Por último, compruebe con el mapa de Google Apps.

0

Escribí una aplicación que ejecuta un servidor web (similar a REST) ​​en su teléfono Android, por lo que puede establecer la posición del GPS de forma remota. El sitio web proporciona un mapa en el que puede hacer clic para establecer una nueva posición, o usar las teclas "wasd" para moverse en cualquier dirección. La aplicación fue una solución rápida, por lo que casi no hay UI ni documentación, pero la implementación es sencilla y puedes buscar todo en las (solo cuatro) clases.

repositorio

Proyecto: https://github.com/juliusmh/RemoteGeoFix

0

Usar este permiso en el archivo de manifiesto

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

Android Studio recomendará que "ubicación simuladas debe ser solicitada en un archivo de manifiesto de prueba o depuración-específica (en src/debug/AndroidManifest.xml)" simplemente desactivar la inspección

Ahora asegúrese de haber comprobado el 'Permitir ubicaciones falsas' en la configuración del desarrollador de su teléfono

Uso LocationManager

locationManager.addTestProvider(mocLocationProvider, false, false, 
       false, false, true, true, true, 0, 5); 
locationManager.setTestProviderEnabled(mocLocationProvider, true); 

Ahora ajuste el ubicación donde quieras

Location mockLocation = new Location(mocLocationProvider); 
     mockLocation.setLatitude(lat); 
     mockLocation.setLongitude(lng); 
     mockLocation.setAltitude(alt); 
     mockLocation.setTime(System.currentTimeMillis()); 

locationManager.setTestProviderLocation (mocLocationProvider, mockLocation);

Cuestiones relacionadas