Emplacement de simulation Android sur l’appareil?

Comment puis-je me moquer de ma position sur un périphérique physique (Nexus One)? Je sais que vous pouvez le faire avec l’émulateur dans le panneau de contrôle Emulator, mais cela ne fonctionne pas pour un périphérique physique.

Il semble que la seule façon de faire est d’utiliser un fournisseur de localisation fictif.

Vous devez activer les emplacements fictifs dans le panneau de développement dans vos parameters et append

 

à votre manifeste.

Maintenant, vous pouvez aller dans votre code et créer votre propre fournisseur de lieu d’implantation et définir l’emplacement de ce fournisseur.

Si vous utilisez ce téléphone uniquement dans un laboratoire de développement, vous pouvez éventuellement souder directement une puce GPS et alimenter un port série directement avec des séquences NMEA provenant d’autres appareils.

J’aurais aimé avoir mon câble à scope de main. Je sais que vous pouvez envoyer un telnet à l’émulateur pour changer son emplacement

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

Je ne me souviens plus si vous pouvez envoyer un telnet à votre appareil, mais je pense que vous le pouvez. J’espère que ça aide.

Vous aurez besoin de adb (android debugging bridge) pour cela (CLI).

Vous pouvez utiliser l’autorisation des services de localisation pour simuler l’emplacement …

"android.permission.ACCESS_MOCK_LOCATION"

et ensuite dans votre code java,

 // Set location by setting the latitude, longitude and may be the altitude... Ssortingng[] 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); 

J’ai eu du succès avec le code suivant. Bien que cela m’ait donné un seul verrou pour une raison quelconque (même si j’ai essayé différentes paires de LatLng), cela a fonctionné pour moi. mLocationManager est un LocationManager mLocationManager à 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 ); } 

Ce que Dr1Ku a posté fonctionne Utilisé le code aujourd’hui mais nécessaire d’append plus de locus. Alors, voici quelques améliorations:

Facultatif: Au lieu d’utiliser la chaîne LocationManager.GPS_PROVIDER, vous pouvez définir votre propre constat PROVIDER_NAME et l’utiliser. Lors de l’enregistrement des mises à jour d’emplacement, choisissez un fournisseur via des critères au lieu de le spécifier directement sous forme de chaîne.

Tout d’abord: au lieu d’appeler removeTestProvider, vérifiez d’abord s’il existe un fournisseur à supprimer (pour éviter une exception IllegalArgumentException):

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

Deuxièmement: pour publier plus d’un emplacement, vous devez définir l’heure de l’emplacement:

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

Il semble également y avoir un Google Test qui utilise MockLocationProviders: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/android/location/LocationManagerProximityTest.java

Un autre bon exemple de travail peut être trouvé à: http://pedroassuncao.com/blog/2009/11/12/android-location-provider-mock/

Un autre bon article est: http://ballardhack.wordpress.com/2010/09/23/location-gps-and-automated-testing-on-android/#comment-1358 Vous trouverez également du code qui fonctionne réellement pour moi sur l’émulateur.

Il existe des applications disponibles sur Android Market qui vous permettent de spécifier un «emplacement GPS simulé» pour votre appareil.

J’ai cherché https://market.android.com et j’ai trouvé une application appelée “My Fake Location” qui fonctionne pour moi.

Le Mock GPS Provider mentionné par Paul ci-dessus (à l’ adresse http://www.cowlumbus.nl/forum/MockGpsProvider.zip ) est un autre exemple qui inclut le code source – bien que je n’ai pas pu installer le fichier APK fourni [INSTALL_FAILED_OLDER_SDK] et peut-être besoin d’une recompilation)

Pour utiliser des emplacements de simulation GPS, vous devez l’activer dans les parameters de votre appareil. Allez dans Paramètres -> Applications -> Développement et cochez “Autoriser les emplacements fictifs”

Vous pouvez ensuite utiliser une application comme celles décrites ci-dessus pour définir les coordonnées GPS. Google Maps et d’autres applications utiliseront la localisation GPS simulée que vous spécifiez.

Cela a fonctionné pour moi (Android Studio):

Désactiver le suivi GPS et WiFi sur le téléphone. Sur Android 5.1.1 et versions ultérieures, sélectionnez “Activer les emplacements fictifs” dans les Options du développeur.

Faites une copie de votre manifeste dans le répertoire src / debug. Ajoutez les éléments suivants (en dehors de la balise “application”):

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

Configurez un fragment de carte appelé “map”. Incluez le code suivant dans 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); } }; 

Notez que vous devrez peut-être augmenter temporairement “minSdkVersion” dans votre fichier de graduation de module à 17 afin d’utiliser la méthode “setElapsedRealtimeNanos”.

Incluez le code suivant dans la classe d’activité principale:

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

Exécutez votre application avec AS. Sur Android 6.0 et supérieur, vous obtenez une exception de sécurité. Maintenant, allez dans Options du développeur dans Paramètres et sélectionnez “Sélectionner l’application de l’emplacement simulé”. Sélectionnez votre application dans la liste.

Maintenant, lorsque vous appuyez sur la carte, onLocationChanged () se déclenche avec les coordonnées de votre robinet.

Je viens juste de le comprendre alors maintenant je n’ai pas à faire le tour du quartier avec des téléphones à la main.

J’ai créé un simple gestionnaire simulant une position en mouvement à partir d’une position initiale.

Démarrez-le dans votre rappel de connexion:

 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 classe 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; } } } 

J’espère que ça peut aider ..

La solution mentionnée par icyerasor et fournie par Pedro à http://pedroassuncao.com/blog/2009/11/12/android-location-provider-mock/ a très bien fonctionné pour moi. Cependant, il ne prend pas en charge le démarrage, l’arrêt et le redémarrage corrects du fournisseur de simulateurs GPS.

J’ai un peu changé son code et réécrit la classe pour qu’elle devienne une AsyncTask au lieu d’un thread. Cela nous permet de communiquer avec le thread d’interface utilisateur, de sorte que nous pouvons redémarrer le fournisseur au point où nous étions lorsque nous l’avons arrêté. Cela s’avère pratique lorsque l’orientation de l’écran change.

Le code, ainsi qu’un exemple de projet pour Eclipse, peuvent être trouvés sur GitHub: https://github.com/paulhoux/Android-MockProviderGPS

Tout le crédit devrait aller à Pedro pour faire le gros du travail.

Fake GPS app de Google Play a fait le tour pour moi. Assurez-vous de lire toutes les instructions dans la description de l’application. Vous devez désactiver d’autres services de localisation et démarrer votre application après avoir activé “Fake GPS”. Travaillé très bien pour ce dont j’avais besoin.

Voici le lien vers l’application sur GooglePlay: Fake GPS

Le tutoriel de Google pour ce faire peut être trouvé ici, il fournit des exemples de code et explique le processus.

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

Si votre appareil est branché sur votre ordinateur et que vous essayez de changer, envoyez des cordons GPS via le contrôle Emulator, cela ne fonctionnera pas.
Ceci est un contrôle EMULATOR pour une raison.
Configurez-le simplement pour vous informer de la modification du 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(Ssortingng provider, int status, Bundle extras) { bigInfo.setText("Changed "+ status); } public void onProviderEnabled(Ssortingng provider) { bigInfo.setText("Enabled "+ provider); } public void onProviderDisabled(Ssortingng provider) { bigInfo.setText("Disabled "+ provider); } }; 

Lorsque le GPS est mis à jour, réécrivez la méthode suivante pour faire ce que vous voulez;

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

N’oubliez pas de les mettre dans le manifeste
android.permission.ACCESS_FINE_LOCATION
android.permission.ACCESS_MOCK_LOCATION

Peut-être que ce n’est pas l’approche «programmeur», mais si vous voulez économiser votre temps et obtenir une solution de travail, essayez l’une des applications dédiées à la localisation fictive disponible dans Google Play:

Faux emplacement GPS Spoofer

Fausses localisations

Faux emplacement GPS

Installez l’application Fake GPS https://play.google.com/store/apps/details?id=com.incorporateapps.fakegps.fre&hl=en

Options de développeur -> Sélectionnez l’application de localisation fictive (c’est-à-dire, l’application de faux emplacement sélectionnée).

Fake app GPS :

Double onglet sur la carte à append -> cliquez sur le bouton de lecture -> Afficher le toast “Faux emplacement arrêté”

enfin, vérifiez avec les applications de carte google.

Je me demande si vous avez besoin de la configuration élaborée de Mock Location. Dans mon cas, une fois que j’ai reçu un correctif, j’appelais une fonction pour faire quelque chose avec ce nouvel emplacement. Dans une timer créer un emplacement simulé. Et appelez la fonction avec cet emplacement à la place. Tout au long de cette connaissance, le GPS trouverait un véritable emplacement actuel. Ce qui est correct Si vous avez l’heure de mise à jour suffisamment longue.

J’ai écrit une application qui exécute un WebServer (similaire à REST) ​​sur votre téléphone Android, afin que vous puissiez définir la position GPS à distance . Le site Web fournit une carte sur laquelle vous pouvez cliquer pour définir une nouvelle position ou utiliser les touches “wasd” pour vous déplacer dans n’importe quelle direction. L’application était une solution rapide, il n’y a donc presque pas d’interface utilisateur ni de documentation, mais l’implémentation est simple et vous pouvez tout regarder dans les quatre (seulement) classes.

Référentiel de projet: https://github.com/juliusmh/RemoteGeoFix

Profitez du simulateur de localisation interactif très pratique et gratuit pour téléphones et tablettes Android (nommé CATLES). Il se moque de l’emplacement du GPS au niveau de l’ensemble du système (même dans les applications Google Maps ou Facebook) et fonctionne sur les périphériques physiques et virtuels:

Site Web: http://ubicom.snet.tu-berlin.de/catles/index.html

Vidéo: https://www.youtube.com/watch?v=0WSwH5gK7yg

Utilisez cette autorisation dans le fichier manifeste

  

android studio recommandera que «l’emplacement de la simulation ne soit demandé que dans un fichier manifeste spécifique au test ou au débogage (généralement src / debug / AndroidManifest.xml)», il suffit de désactiver l’inspection

Maintenant, assurez-vous que vous avez coché la case ” Autoriser les emplacements fictifs ” dans les parameters du développeur de votre téléphone.

Utiliser LocationManager

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

Maintenant, définissez l’emplacement où vous voulez

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