Android simula la ubicación en el dispositivo?

¿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.

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

Debe habilitar las ubicaciones simuladas en el panel de desarrollo en su configuración y agregar

 

a tu manifiesto

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

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

Ojalá tuviera mi cable a mano. Sé que puedes hacer 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 recuerdo si puedes usar telnet en tu dispositivo, pero creo que puedes. Espero que esto ayude.

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

Puede usar el permiso de Servicios de ubicación para simular la ubicación …

"android.permission.ACCESS_MOCK_LOCATION"

y luego en tu 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); 

Tuve éxito con el siguiente código. Aunque me consiguió un único locking por alguna razón (incluso si he probado diferentes pares LatLng), funcionó para mí. mLocationManager es un 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 ); } 

Lo que Dr1Ku publicó funciona. Usó el código hoy pero necesitaba agregar más locs. Así que aquí hay algunas mejoras:

Opcional: en lugar de usar la cadena LocationManager.GPS_PROVIDER, es posible que 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 a removeTestProvider, primero verifique si hay un proveedor que se eliminará (para evitar IllegalArgumentException):

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

Segundo: para publicar más de una ubicación, debe establecer la hora de la ubicación:

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

También parece haber una Prueba de Google que usa 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 yo en el emulador.

Hay aplicaciones disponibles en Android Market que le permiten especificar una “Ubicación simulada del GPS” para su dispositivo.

Busqué en 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 recomstackción)

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

A continuación, puede utilizar una aplicación como las descritas anteriormente para establecer las coordenadas de GPS, y los mapas de Google y otras aplicaciones utilizarán la ubicación simulada de GPS que especifique.

Esto funcionó para mí (Android Studio):

Deshabilite el seguimiento de GPS y WiFi en el 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 lo siguiente a él (fuera de la etiqueta de “aplicación”):

uses-permission android: name = “android.permission.ACCESS_MOCK_LOCATION”

Configure un Fragmento de mapa llamado “mapa”. Incluya 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 es posible que tenga que boost temporalmente “minSdkVersion” en su archivo gradle de módulo a 17 para utilizar el método “setElapsedRealtimeNanos”.

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

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

Ejecute 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 tocas el mapa, onLocationChanged () disparará con las coordenadas de tu toque.

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

Creé un controlador simple que simula una posición de movimiento desde una posición inicial.

Comience en su callback de 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; } } } 

Espero que pueda ayudar ..

La solución mencionada por icyerasor y provista por Pedro en 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 reescribí 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 por hacer la mayor parte del trabajo duro.

La aplicación de GPS falsa 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: GPS falso

El tutorial de Google para hacer esto se puede encontrar aquí, proporciona ejemplos de código y explica el proceso.

http://developer.android.com/training/location/location-testing.html#SendMockLocations

Si su dispositivo está conectado a su computadora y está tratando de cambiarlo, envíe 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 te olvides de poner esto en el manifiesto
android.permission.ACCESS_FINE_LOCATION
android.permission.ACCESS_MOCK_LOCATION

Tal vez no se trata de un enfoque de “progtwigdor”, pero si desea ahorrar tiempo y obtener una solución que funcione al instante, pruebe una de las aplicaciones dedicadas a la ubicación simulada disponible en Google Play:

Localización falsa del GPS Spoofer

Ubicaciones simuladas

Ubicación falsa del GPS

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

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

Aplicación de GPS falso :

Doble pestaña en el mapa para agregar -> haga clic en el botón de reproducción -> Mostrar la tostada “Ubicación falsa detenida”

finalmente verifique con las aplicaciones de mapas de google.

Me pregunto si necesitas la elaborada configuración de 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.

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 de proyectos: https://github.com/juliusmh/RemoteGeoFix

Haga uso del simulador de ubicación interactiva muy conveniente y gratuito para teléfonos y tabletas Android (llamado CATLES). Se burla de la ubicación del GPS a nivel de todo el sistema (incluso dentro de las aplicaciones de Google Maps o Facebook) y funciona tanto en dispositivos físicos como virtuales:

Sitio web: http://ubicom.snet.tu-berlin.de/catles/index.html

Video: https://www.youtube.com/watch?v=0WSwH5gK7yg

Use este permiso en el archivo de manifiesto

  

android studio recomendará que “la ubicación simulada solo se solicite en una prueba o archivo de manifiesto específico de depuración (típicamente src / debug / AndroidManifest.xml)” simplemente desactive la inspección

Ahora asegúrate de haber marcado ” Permitir ubicaciones simuladas ” en la configuración del desarrollador de tu teléfono

Usar LocationManager

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

Ahora establece la 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);