Comment émuler la localisation GPS dans L'émulateur Android?
30 réponses
vous pouvez vous connecter à L'émulateur via Telnet. Vous disposez alors d'une console D'émulateur qui vous permet d'entrer certaines données comme les géo-correctifs, le réseau, etc.
comment utiliser la console est expliqué en détail ici . Pour se connecter à la console, ouvrez une ligne de commande et tapez
telnet localhost 5554
vous pouvez alors utiliser la commande geo pour définir une latitude, longitude et si nécessaire l'altitude sur le dispositif qui est passé à tous les programmes en utilisant le fournisseur de localisation gps. Voir le lien ci-dessus pour plus d'instructions.
la commande spécifique à exécuter dans la console est
geo fix <longitude value> <latitude value>
j'ai trouvé ce site utile pour trouver un lat/lng réaliste: http://itouchmap.com/latlong.html
si vous avez besoin de plus d'une coordonnée, vous pouvez utiliser un fichier kml avec une route .c'est un peu décrit dans cet article . Je ne peux pas trouver un meilleure source pour le moment.
je cherchais une meilleure façon de régler les coordonnées GPS de l'émulateur qu'en utilisant geo fix
et en déterminant manuellement la latitude et la longitude spécifiques.
incapable de trouver quoi que ce soit, j'ai mis en place un petit programme qui utilise GWT et L'API GoogleMaps pour lancer un outil de cartographie basé sur un navigateur pour définir la localisation GPS dans l'émulateur:
espérons qu'il peut être utile pour aider les autres qui tomberont sans doute à travers cette difficulté / question aussi bien.
si vous utilisez Eclipse
, passez à Window->Open Perspective->DDMS
, puis tapez un dans Location Controls
et appuyez sur Send
.
personne ici n'a mentionné la solution intégrée de l'émulateur lui-même, donc pour les futurs visiteurs, Je voudrais le partager avec des visuels.
tout d'abord, lancez votre émulateur Android et cliquez sur le bouton menu (3 points) ci-dessous:
ensuite, à partir du volet de gauche, sélectionnez Location et changez les coordonnées en fonction de vos besoins. Après avoir appuyé sur envoyer Bouton, les changements prendront effet immédiatement (je vous recommande d'ouvrir Google Maps pour une meilleure compréhension).
Version Android Studio: 2.3.3
pour les utilisateurs de Android Studio:
exécuter l'émulateur,
ensuite, passez à Tools -> Android ->Android device monitor
ouvrez l'onglet Emulator Control
et utilisez le groupe de contrôle d'emplacement.
en supposant que vous avez un mapview configuré et lancé:
MapView mapView = (MapView) findViewById(R.id.mapview);
final MyLocationOverlay myLocation = new MyLocationOverlay(this, mapView);
mapView.getOverlays().add(myLocation);
myLocation.enableMyLocation();
myLocation.runOnFirstFix(new Runnable() {
public void run() {
GeoPoint pt = myLocation.getMyLocation();
}
});
vous aurez besoin de la permission suivante dans votre manifeste:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
et pour envoyer des coordonnées simulées à L'émulateur à partir D'Eclipse, allez dans le menu" fenêtre", sélectionnez" Afficher " > "autre" > "contrôle de l'émulateur", et vous pouvez envoyer des coordonnées à partir du panneau de contrôle de l'émulateur qui apparaît.
pour le nouvel émulateur:
http://developer.android.com/tools/devices/emulator.html#extended
Fondamentalement, cliquez sur les trois points de bouton dans l'émulateur contrôles (à droite de l'émulateur), et il va ouvrir un menu qui vous permettra de contrôler l'émulateur, y compris l'emplacement
1. Utilisateurs d'Android Studio.
après l'exécution de L'émulateur outils goto - > Android->Android device monitor
cliquez sur l'onglet changement de contrôle de L'émulateur à partir du groupe de contrôle de l'emplacement.
2. Utilisateurs d'Eclipse.
D'abord dans Eclipse dans le Menu Sélectionner" Fenêtre "puis sélectionner" Ouvrir La Perspective "puis sélectionner"DDMS". I. e Window - > Open Prespective - > DDMS.
vous verrez sur le Panneau de dispositifs côté gauche et sur le côté droit vous verrez différents onglets. Sélectionnez L'Onglet "Contrôle De L'Émulateur".
en bas, vous verrez le Panneau de contrôle de L'emplacement. Sélectionnez L'Onglet "Manuel".
entrez la Longitude et la Latitude dans les zones de texte, puis cliquez sur le bouton Envoyer. Il enverra la position à vous émulateur et l'application.
3. À l'aide de telnet.
In la commande exécuter tapez ceci.
telnet localhost 5554
Si vous n'utilisez pas windows, vous pouvez utiliser n'importe quel client telnet.
Après la connexion avec telnet utilisez la commande suivante pour envoyer votre position à l'émulateur.
geo fix long lat
geo fix -121.45356 46.51119 4392
4. Utilisez L'outil GoogleMaps basé sur le navigateur
il y a un programme qui utilise GWT et L'API GoogleMaps pour lancer un outil cartographique basé sur un navigateur pour définir la localisation GPS dans l'émulateur:
utilisant la commande" geo "dans la console de l'émulateur
pour envoyer des données de localisation à partir de la ligne de commande:
-
lancez votre application dans L'émulateur Android et ouvrez un terminal/console dans votre répertoire SDK /tools.
-
connectez-vous à la console de l'émulateur:
telnet localhost 5555
(remplacer 5555 par n'importe quel port sur lequel votre émulateur tourne)) -
envoyer les données de localisation: * géo-correction pour envoyer une géo-localisation fixe.
cette commande accepte une longitude et une latitude en degrés décimaux, et une altitude optionnelle en mètres. Par exemple:
geo fix -121.45356 46.51119 4392
j'ai écrit un script python pour pousser les localisations gps à l'émulateur via telnet. Il définit une source et un lieu de destination. Il y a aussi un décalage horaire qui vous permet de contrôler la longueur des coordonnées qui seront poussées vers l'appareil. Un endroit est poussé une fois par seconde.
dans l'exemple ci-dessous, le script se déplace de Berlin à Hambourg en 120 secondes. Une étape / localisation gps par seconde avec des distances aléatoires.
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import telnetlib
from time import sleep
import random
HOST = "127.0.0.1"
PORT = 5554
TIMEOUT = 10
LAT_SRC = 52.5243700
LNG_SRC = 13.4105300
LAT_DST = 53.5753200
LNG_DST = 10.0153400
SECONDS = 120
LAT_MAX_STEP = ((max(LAT_DST, LAT_SRC) - min(LAT_DST, LAT_SRC)) / SECONDS) * 2
LNG_MAX_STEP = ((max(LNG_DST, LNG_SRC) - min(LNG_DST, LNG_SRC)) / SECONDS) * 2
DIRECTION_LAT = 1 if LAT_DST - LAT_SRC > 0 else -1
DIRECTION_LNG = 1 if LNG_DST - LNG_SRC > 0 else -1
lat = LAT_SRC
lng = LNG_SRC
tn = telnetlib.Telnet(HOST, PORT, TIMEOUT)
tn.set_debuglevel(9)
tn.read_until("OK", 5)
tn.write("geo fix {0} {1}\n".format(LNG_SRC, LAT_SRC))
#tn.write("exit\n")
for i in range(SECONDS):
lat += round(random.uniform(0, LAT_MAX_STEP), 7) * DIRECTION_LAT
lng += round(random.uniform(0, LNG_MAX_STEP), 7) * DIRECTION_LNG
#tn.read_until("OK", 5)
tn.write("geo fix {0} {1}\n".format(lng, lat))
#tn.write("exit\n")
sleep(1)
tn.write("geo fix {0} {1}\n".format(LNG_DST, LAT_DST))
tn.write("exit\n")
print tn.read_all()
j'utilise la fonction DDMS d'eclipse plug pour envoyer GPS.
dans Linux où les ports de communication sont bloqués. dirigez le terminal vers le dossier plate-forme-Outils à l'intérieur de android sdk
et lancez cette commande:
./adb -s #{device_name} emu geo fix #{longitude} #{latitude}
dans Mac, Linux ou Cygwin:
echo 'geo fix -99.133333 19.43333 2202' | nc localhost 5554
qui vous placera à Mexico. Changez votre longitude / latitude / altitude en conséquence. Cela devrait être suffisant si vous n'êtes pas intéressé dans nmea.
Voir Obtention De L'Emplacement De L'Utilisateur
Regardez sous se Moquer de Fournir des Données de Localisation . Vous trouverez la solution pour elle.
premier go dans la section DDMS de votre éclipse Que le contrôle de l'émulateur ouvert .... Aller À La Section Manuel réglez lat et long, puis appuyez sur le bouton Envoyer
la solution suivante a fonctionné pour moi - ouvrir la ligne de commande et écrire:
adb emu geo fix [longtitude] [latitude]
j'essayais de régler le géo-correctif par adb pour de nombreux points et je n'ai pas pu obtenir mon application pour voir des données GPS. Mais quand j'ai essayé D'ouvrir DDMS, en sélectionnant le processus de mon application et en envoyant des coordonnées par l'intermédiaire de l'onglet de contrôle de l'émulateur, cela a fonctionné tout de suite.
Dalvik Debug Monitor > Sélectionnez Émulateur > Émulateur Contrôle Onglet > Emplacement Des Commandes.
DDMS -- android_sdk/outils/ddms OU android_sdk/outils/moniteur
si vous utilisez eclipse puis en utilisant Émulator controller vous pouvez définir la latitude et la longitude manuellement et exécuter votre application basée sur la carte dans émulateur
si vous utilisez Android Studio (1.3):
- cliquez sur le Menu "Outils"
- "Android"
- "Android device monitor"
- cliquez sur votre émulateur actuel
- Onglet "Émulateur" Contrôle
- passer à "Contrôles D'emplacement" et entrer Lat et Lon
faites simplement la réponse D'Alberto Gaona en une seule ligne
token=$(cat ~/.emulator_console_auth_token); cat <(echo -e "auth $token \n geo fix 96.0290791 16.9041016 \n exit") - | nc localhost 5554
5554 est le numéro de port de l'émulateur indiqué dans adb devices
.
il aurait été préférable que adb emu
fonctionne.
si les solutions ci-dessus ne fonctionnent pas. Essayez ceci:
dans votre manifeste androïde.xml, ajouter les deux liens suivants à L'extérieur de de l'étiquette de la demande, mais à l'intérieur de votre étiquette de manifeste bien sûr
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" ></uses-permission>
<uses-permission android:name="android.permission.INTERNET" ></uses-permission>
j'ai été incapable d'obtenir un GPS sur l'émulateur quand l'émulateur exécutait L'Image Android sans Google APIs. Dès que j'ai changé l'image pour contenir Google APIs tous les moyens mentionnés ici pour obtenir un GPS corriger travaillé.
assurez-vous de sélectionner une image avec Google APIs lors de la création de AVD.
pour mon propre projet, j'ai développé un service en ligne qui peut fournir un emplacement simulé à L'émulateur Android.
il utilise geo nmea plutôt que Geo fix qui lui permet de régler la vitesse, Le Cap, l'heure précise, etc. en plus de juste lat / lon.
Le service nécessite la nc (netcat) utilitaire de ligne de commande et rien d'autre.
vous pouvez utiliser un émulateur comme genymotion qui vous donne la flexibilité d'émuler votre position GPS actuelle, etc.
il y a un plugin pour Android Studio appelé"Mock Location Plugin". Vous pouvez émuler plusieurs points avec ce plugin. Vous pouvez trouver un manuel d'utilisation détaillé sur ce lien: Android Studio. Simuler plusieurs points GPS avec le Plugin de localisation simulée
Open Android studio - > menu Outils->Android - > Moniteur D'appareil Android- > onglet émulateur - > contrôle D'emplacement - > Réglez votre latitude et longitude requises et vérifiez votre projet selon votre besoin
Le déjà mentionné plusieurs fois une réponse à utiliser la commande shell " geo fix... " est la bonne réponse. Mais dans le cas où vous utilisez LocationClient.getLastLocation () pour récupérer vos données, il est important de mentionner que cela ne fonctionnera pas au début. La classe LocationClient utilise le service Google Play pour récupérer les coordonnées. Pour moi, cela a commencé à fonctionner après avoir lancé l'application emulators maps une fois. Lors du premier départ, il vous est demandé de permettez à googleapps d'accéder à votre emplacement, ce qui, je suppose, fait l'affaire.
Dans eclipse:
vous devrez peut-être faire glisser la fenêtre du SGDD vers le bas. Les "contrôles de localisation" sont situés sous les "actions de téléphonie" et peuvent être masqués par une vue de console de taille normale ( la barre avec console, LogCat etc peut le couvrir!)
~
ne peut pas encore commenter, donc la mise à jour de @ectomorphs répond ici, ce qui quand telneting nécessite maintenant d'avoir un jeton auth. Sous linux que sous /home/username/.emulator_console_auth_token
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import telnetlib
from time import sleep
import random
FILE = open('/home/username/.emulator_console_auth_token', 'r')
AUTH_TOKEN = FILE.read()
FILE.close()
HOST = "127.0.0.1"
PORT = 5554
TIMEOUT = 10
LAT_SRC = 52.5243700
LNG_SRC = 13.4105300
LAT_DST = 53.5753200
LNG_DST = 10.0153400
SECONDS = 120
LAT_MAX_STEP = ((max(LAT_DST, LAT_SRC) - min(LAT_DST, LAT_SRC)) / SECONDS) * 2
LNG_MAX_STEP = ((max(LNG_DST, LNG_SRC) - min(LNG_DST, LNG_SRC)) / SECONDS) * 2
DIRECTION_LAT = 1 if LAT_DST - LAT_SRC > 0 else -1
DIRECTION_LNG = 1 if LNG_DST - LNG_SRC > 0 else -1
lat = LAT_SRC
lng = LNG_SRC
tn = telnetlib.Telnet(HOST, PORT, TIMEOUT)
tn.set_debuglevel(9)
tn.read_until("OK", 5)
tn.write("auth {0}\n".format(AUTH_TOKEN))
tn.read_until("OK", 5)
tn.read_until("OK", 5)
tn.write("geo fix {0} {1}\n".format(LNG_SRC, LAT_SRC))
#tn.write("exit\n")
for i in range(SECONDS):
lat += round(random.uniform(0, LAT_MAX_STEP), 7) * DIRECTION_LAT
lng += round(random.uniform(0, LNG_MAX_STEP), 7) * DIRECTION_LNG
#tn.read_until("OK", 5)
tn.write("geo fix {0} {1}\n".format(lng, lat))
#tn.write("exit\n")
sleep(1)
tn.write("geo fix {0} {1}\n".format(LNG_DST, LAT_DST))
tn.write("exit\n")
print tn.read_all()
à partir d'un script shell on peut définir le coorinate comme
#!/usr/bin/env bash
export ATOKEN=`cat ~/.emulator_console_auth_token`
echo -ne "auth $ATOKEN\ngeo fix -99.133333 19.43333 2202\n" | nc localhost 5554