Comment émuler la position GPS dans l'émulateur Android?

445

Je veux obtenir la longitude et la latitude dans l'émulateur Android pour les tests.

Quelqu'un peut-il me guider pour y parvenir?

Comment définir l'emplacement de l'émulateur sur une position de test?

UMAR
la source
Si vous utilisez Genymotion: stackoverflow.com/questions/30709329/…
Hachem Benyahia
Vous pouvez installer l'une des nombreuses applications de localisation fictive sur le Play Store.
whoKnows

Réponses:

443

Vous pouvez vous connecter à l'émulateur via Telnet. Vous avez ensuite une console d'émulateur qui vous permet d'entrer certaines données comme les correctifs géographiques, le réseau, etc.

Comment utiliser la console est expliqué en détail ici . Pour vous connecter à la console, ouvrez une ligne de commande et tapez

telnet localhost 5554

Vous pouvez ensuite utiliser la commande geo pour définir une latitude, une longitude et, si nécessaire, une altitude sur l'appareil qui est transmise à tous les programmes à l'aide du 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 également utiliser un fichier kml avec un itinéraire, c'est un peu décrit dans cet article . Je ne peux pas trouver de meilleure source pour le moment.

Janusz
la source
13
en utilisant geo fix, j'ai également défini une latitude et une longitude fictives toujours en position nulle.
UMAR
2
ou de manière simple, activez le gps dans l'émulateur et accédez au contrôle de l'émulateur.
UMAR
35
adb emu geo fix 30.219470 -97.745361
Bryan Rehbein
12
Attention à l'ordre, avant le lat!
Christoph
14
La geo fixcommande n'est disponible que si vous en authpremier.
Cela
126

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, exécutez votre émulateur Android et cliquez sur le bouton de menu (3 points) illustré ci-dessous:

émulateur avec bouton de menu

Ensuite, dans le volet gauche, sélectionnez Emplacement et modifiez les coordonnées en fonction de vos besoins. Après avoir appuyé sur le bouton Envoyer , les modifications prendront immédiatement effet (je vous recommande d'ouvrir Google Maps pour une meilleure compréhension).

entrez la description de l'image ici

Version Android Studio: 2.3.3

De plus, pour que vos différents emplacements arrivent dans votre application en temps réel, vous pouvez utiliser le fichier GPX. Il est très facile de créer ce fichier à partir du lien de direction de Google Map:

  1. Allez sur google map, choisissez un emplacement, puis appuyez sur "Directions" et entrez le deuxième emplacement.
  2. Une fois l'itinéraire créé, copiez un lien depuis le navigateur
  3. Accédez à ce site Web: https://mapstogpx.com et collez le lien vers la case "Allons-y"
  4. Appuyez sur le bouton "Let's Go" et le fichier GPX sera téléchargé

Utilisez le bouton "Charger GPS / KML" pour charger le fichier créé sur votre émulateur, choisissez la vitesse et appuyez sur le bouton de lecture vert en bas. Les emplacements seront envoyés en temps réel comme indiqué sur l'image ci-dessous.

entrez la description de l'image ici

Eden
la source
dans cette solution besoin d'un service de jeu en émulateur?
Kevan Aghera
Je ne pense pas.
eden
lorsque j'ouvre l'application dans l'émulateur google api client null afin de ne pas pouvoir charger la carte dans l'émulateur. et l'appareil mobile est ok pour moi.
Kevan Aghera
4
Je confirme qu'il n'est pas nécessaire de se connecter à votre compte Google pour ce faire. Cool!
xarlymg89
3
J'ai dû redémarrer le système d'exploitation émulé pour qu'il reconnaisse le nouvel emplacement.
Nate Whittaker
109

Je cherchais un meilleur moyen de définir les coordonnées GPS de l'émulateur que d'utiliser geo fixet de déterminer manuellement les coordonnées de latitude et de longitude spécifiques.

Impossible de trouver quoi que ce soit, j'ai mis en place un petit programme qui utilise GWT et l'API Google Maps pour lancer un outil de carte basé sur un navigateur pour définir l'emplacement GPS dans l'émulateur:

android-gps-emulator

J'espère que cela peut être utile pour aider d'autres personnes qui tomberont sans aucun doute sur cette difficulté / question.

dpdearing
la source
Wow merci! la configuration a très bien fonctionné, mais je n'ai pas pu gérer une connexion à l'émulateur -> journal imprime java.net.ConnectionRefused. alors j'ai essayé telnet localhost 5554 (depuis le terminal) et cela a fonctionné. Quelqu'un d'autre a-t-il testé votre émulateur avec succès sur mac?
ottel142
1
Je ne l'ai pas testé, mais cela a l'air tellement génial que je pense que Google devrait en parler au monde. Les idées simples sont toujours les meilleures. Pourquoi personne n'y a-t-il pensé?
tiktak
@ ottel142 - Oui, je fonctionne en fait sur un Mac sans ce problème (en utilisant Chrome sur Mavericks). Je vois donc ce ConnectionRefusedmessage si je lance l'émulateur GPS avant de démarrer l'appareil virtuel Android. En haut de mon navigateur, il indique également "Erreur lors de la connexion sur le port 5554 ..." Tout fonctionne bien si je clique sur le bouton "Changer le port de l'émulateur" pour se reconnecter
dpdearing
Exactement ce dont j'avais besoin.
David
C'est un bon programme, mais la localité du système change la façon dont les flotteurs fonctionnent. Sur mon système, cela doit être comme des geo fix 42,42 42,42 42virgules au lieu de points.
nurettin
81

Si vous utilisez Eclipse, accédez à Window->Open Perspective->DDMS, puis saisissez-en un Location Controlset appuyez sur Send.

SteveCav
la source
8
C'est de loin la méthode la plus simple que j'ai vue. Assurez-vous de configurer votre AVD avec prise en charge GPS, puis dans la perspective DDMS, cliquez sur l'émulateur qui s'exécute sous Périphériques, choisissez l'onglet Contrôle de l'émulateur dans le volet central droit puis en bas se trouve la section Contrôles de localisation mentionnée par SteveCav (Utilisation Eclipse Juno 4.2 pour les développeurs Java avec la dernière version d'ADT). Mon panneau de contrôle de localisation a même été préchargé avec des données de localisation.
Steven Magana-Zook
très bonne réponse! fonctionne avec n'importe quelle idée car ddms fait partie du sdk (yoursdkfolder / tools /)
Zarokka
1
Cela, ni la solution telnet ci-dessus, fonctionnait pour moi. J'essaie d'obtenir mon emplacement comme celui-ci, mais il est toujours nul. LocationManager mlocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); Location location = mlocManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
crowmagnumb
Lorsque j'utilise des "contrôles de localisation" dans DDMS, j'obtiens l'erreur suivante lorsque j'essaie d'envoyer Unable to send command to the emulator. Une idée pourquoi ça ne marche pas? J'utilise le Nexus 4 AVD par défaut
emersonthis
1
Je ne suis pas en mesure de le faire, les contrôles d'emplacements sont grisés
Utsav Gupta
33

Pour les utilisateurs d'Android Studio:

exécutez l'émulateur,

Ensuite aller à Tools -> Android ->Android device monitor

ouvrez l' Emulator Controlonglet et utilisez le groupe de contrôles d'emplacement.

ofer
la source
Dans mon cas, tous les fichiers sont non modifiables. Avez-vous une idée ?
Olkunmustafa
4
@MustafaOlkun Cela signifie probablement que l'émulateur lui-même dispose de ces contrôles. Recherchez un "..." à côté de l'émulateur.
Justin
3
J'ai le même problème. Ils ne sont pas modifiables. et oui il y a le "...". Cependant quand je mets quelque chose là-bas et envoie, rien ne change sur l'application ....
KansaiRobot
14

En supposant que vous avez configuré et exécuté une vue de carte:

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 l'autorisation suivante dans votre manifeste:

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

Et pour envoyer des coordonnées simulées à l'émulateur depuis Eclipse, allez dans le menu "Fenêtre", sélectionnez "Afficher la vue"> "Autre"> "Contrôle de l'émulateur", et vous pouvez envoyer des coordonnées à partir du volet de contrôle de l'émulateur qui apparaît.

David Hedlund
la source
3
mais mon ami où sont la longitude et la latitude ??
UMAR
1
J'ai essayé d'utiliser ceci et d'envoyer des valeurs fictives au contrôle de l'émulateur, mais lorsque j'appuie sur le bouton d'envoi, il ne fait rien, aucun message n'apparaît pour confirmer les valeurs envoyées ou non. chose seocnd GeoPoint g = myLocation.getMyLocation (); renvoie une valeur nulle.
UMAR
Êtes-vous sûr de l'utiliser à l'intérieur runOnFirstFix? Parce que c'est l'événement qui est déclenché lorsque l'appareil reçoit la position GPS pour la première fois, donc si cela se produit, il getMyLocationdevrait certainement retourner une valeur.
David Hedlund
13

1. Utilisateurs d'Android Studio.

Après avoir exécuté l'émulateur, accédez à Outils-> Android-> Moniteur de périphérique Android

Cliquez sur la modification de l'onglet Contrôle de l'émulateur dans le groupe de contrôles d'emplacement.

2. Utilisateurs Eclipse.

D'abord dans Eclipse Dans le menu Sélectionnez "Fenêtre" puis sélectionnez "Ouvrir la perspective" puis sélectionnez "DDMS". c'est-à-dire Fenêtre-> Ouvrir la perspective-> DDMS.

Vous verrez sur le panneau des périphériques du côté gauche et sur le côté droit, vous verrez différents onglets. Sélectionnez l'onglet "Emulator Control".

En bas, vous verrez le panneau des commandes de localisation. Sélectionnez l'onglet "Manuel".

Entrez la longitude et la latitude dans les zones de texte, puis cliquez sur le bouton Envoyer. Il vous enverra la position de l'émulateur et de l'application.

3. Utilisation de telnet.

Dans la commande run, tapez ceci.

telnet localhost 5554

Si vous n'utilisez pas Windows, vous pouvez utiliser n'importe quel client Telnet.

Après vous être connecté à 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 Google Maps basé sur un navigateur

Il existe un programme qui utilise GWT et l'API Google Maps pour lancer un outil de carte basé sur un navigateur pour définir l'emplacement GPS dans l'émulateur:

android-gps-emulator

Muhammad Yousaf Sulahria
la source
Cette première option a fonctionné pour moi, avec un petit changement. Je n'ai pas pu ouvrir la fenêtre DDMS depuis Eclipse, je viens de recevoir une page grise vierge. Mais pendant que l'émulateur était en cours d'exécution, si j'ouvrais DDMS à partir d'une invite de commande (C: \ Program Files \ Android \ android-sdk \ tools \ ddms), je pourrais voir la fenêtre que vous avez décrite avec les périphériques à gauche et "Emulator Control" "onglet à droite. Merci!
Eric Barr
10

Utilisation de la commande "geo" dans la console de l'émulateur

Pour envoyer des données d'emplacement fictif à partir de la ligne de commande:

  1. Lancez votre application dans l'émulateur Android et ouvrez un terminal / console dans le répertoire / tools de votre SDK.

  2. Connectez-vous à la console de l'émulateur:

    telnet localhost 5555 (Remplacez le 5555 par le port sur lequel votre émulateur fonctionne)

  3. Envoyer les données de localisation: * geo fix pour envoyer une géo-localisation fixe.

    Cette commande accepte une longitude et une latitude en degrés décimaux et une altitude facultative en mètres. Par exemple:

    geo fix -121.45356 46.51119 4392
Dan Zhao
la source
8

J'ai écrit un script python pour pousser les emplacements gps vers l'émulateur via telnet. Il définit une source et un emplacement de destination. Il existe également un décalage temporel qui vous permet de contrôler la durée pendant laquelle les coordonnées seront transmises à 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. Un emplacement pas / 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()
user937284
la source
Fonctionne comme un charme! Merci d'avoir partagé.
Alberto Gaona
Mmmmm. Je pense qu'il y a une légère erreur: pour autant que je sache, le message de géolocalisation obtient la longitude et la latitude, dans cet ordre: vous les envoyez dans l'autre sens. Voir les réponses ci-dessus.
Alberto Gaona
Ca ne fonctionne pas. L'émulateur écoute sur le port mais ne reçoit rien.
Durga Swaroop
5

J'utilise la fonction DDMS de la prise Eclipse pour envoyer le GPS. entrez la description de l'image ici

eau bouillante
la source
5

Sous Linux où les ports de communication sont bloqués. naviguez le terminal vers le dossier platform-tools à l'intérieur android sdket lancez cette commande:

./adb -s #{device_name} emu geo fix #{longitude} #{latitude}
abhishek singh
la source
5

Sous Mac, Linux ou Cygwin:

echo 'geo fix -99.133333 19.43333 2202' | nc localhost 5554

Cela vous mettra à Mexico. Modifiez votre longitude / latitude / altitude en conséquence. Cela devrait suffire si vous n'êtes pas intéressé par nmea.

Alberto Gaona
la source
Vous devrez peut-être ajuster le 5554 à votre port d'écoute d'émulateur actuel.
Alberto Gaona
5

La solution suivante a fonctionné pour moi - ouvrez la ligne de commande et écrivez:

adb emu geo fix [longtitude] [latitude]
Asaf Pinhassi
la source
5

Enfin, avec la dernière version d'Android Studio 4 et sa nouvelle mise à jour Emulator 23/10/2019, cela devient plus facile. Démarrez votre émulateur et accédez aux paramètres de l'émulateur ...> dans l'onglet "Itinéraires" vous pouvez choisir deux points sur la carte de / vers et démarrer un nouvel itinéraire avec une vitesse de lecture réglable qui peut aller à plus de 1000km / h!

entrez la description de l'image ici

Smile2Life
la source
alors comment obtenir la lng lat actuelle?
Mahmoud Ayman
4

Allez d'abord dans la section DDMS de votre éclipse puis ouvrez le contrôle de l'émulateur .... Allez dans la section manuelle, définissez lat et long puis appuyez sur le bouton Envoyer

sachin pareek
la source
3

J'essayais de définir le correctif géographique via adb pour de nombreux points et je n'ai pas pu faire en sorte que mon application puisse voir les données GPS. Mais quand j'ai essayé d'ouvrir DDMS, de sélectionner le processus de mon application et d'envoyer des coordonnées via l'onglet de contrôle de l'émulateur, cela a tout de suite fonctionné.

James
la source
Vous n'avez pas besoin de spécifier un processus ... Ou peut-être que DDMS en 2010 nécessite de le faire.
3

Dalvik Debug Monitor> Sélectionnez Emulator> Onglet Emulator Control> Location Controls.

DDMS - android_sdk / tools / ddms OU android_sdk / tools / monitor

Dan
la source
2

Si vous utilisez eclipse, puis en utilisant le contrôleur Emulator, vous pouvez définir manuellement la latitude et la longitude et exécuter votre application basée sur la carte dans l'émulateur

Swapnil
la source
2

Si vous utilisez Android Studio (1.3):

  • Cliquez sur le menu "Outils"
  • "Android"
  • "Moniteur d'appareil Android"
  • cliquez sur votre émulateur actuel
  • Onglet "Contrôle de l'émulateur"
  • allez dans "Contrôles de localisation" et entrez Lat et Lon
électrobabe
la source
2

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 mieux valu adb emutravailler.

Kyaw Tun
la source
une doublure très utile! dans mon cas, j'ai dû supprimer les espaces entre \ n: token = $ (cat ~ / .emulator_console_auth_token); cat <(echo -e "auth $ token \ ngeo fix 96.0290791 19.9041016 \ nexit") - | nc localhost 5554
Jeremie
1

Si les solutions ci-dessus ne fonctionnent pas. Essaye ça:

Dans votre Manifest.xml android, ajoutez les deux liens suivants À L'EXTÉRIEUR de la balise d'application, mais à l'intérieur de votre balise manifeste bien sûr

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" ></uses-permission>
<uses-permission android:name="android.permission.INTERNET" ></uses-permission>
ssgao
la source
1

Je n'ai pas pu obtenir de correctif GPS sur l'émulateur lorsque l'émulateur exécutait une image Android sans les API Google. Dès que j'ai changé l'image pour qu'elle contienne les API Google, toutes les méthodes mentionnées ici pour obtenir un correctif GPS fonctionnent.

Assurez-vous de sélectionner une image avec les API Google lors de la création d'AVD.

dvim
la source
qu'entendez-vous par image et lors de la création d'AVD, comment sélectionner une image avec les API Google? il n'y a pas de telles options lors de la création d'AVD dans Eclipse.
user1911703
Assurez-vous d'avoir téléchargé des images avec les API Google via le gestionnaire de SDK Android.
dvim
1

La réponse déjà mentionnée à plusieurs reprises pour utiliser la commande shell " geo fix ... " est la bonne réponse. Mais si vous utilisez LocationClient.getLastLocation () pour récupérer vos données, il convient de mentionner que cela ne fonctionnera pas au premier abord. La classe LocationClient utilise le service Google Play pour récupérer les coordonnées. Pour moi, cela a commencé à fonctionner après avoir exécuté l'application de cartes d'émulateurs une fois. Lors du premier démarrage, vous êtes invité à autoriser les applications Google à accéder à votre emplacement, ce qui, je suppose, fait l'affaire.

Maik
la source
1

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, ce qui lui permet de régler la vitesse, le cap, l'heure précise, etc. en plus des lat / lon.

Le service nécessite l'utilitaire de ligne de commande nc (netcat) et rien d'autre.

http://www.kisstech.ch/nmea/

Gerhard Wesp
la source
1

Ouvrez Android studio-> menu Outils-> Android-> Android Device Monitor-> onglet émulateur-> contrôle de l'emplacement-> définissez la latitude et la longitude requises et vérifiez votre projet selon vos besoins

Premkumar Manipillai
la source
vous pouvez définir la valeur de l'emplacement statique (Latitude et Longitude) quel emplacement vous devez vérifier directement dans la partie codage?
Premkumar Manipillai,
0

En éclipse:

Vous devrez peut-être faire glisser la fenêtre DDMS vers le bas. Les «contrôles de localisation» se trouvent sous «Actions de téléphonie» et peuvent être masqués par une vue de console de taille normale (la barre avec la console, LogCat, etc. peut la couvrir!)

~

Droid Teahouse
la source
Dans DDMS, j'ai trouvé sous Emulator Control. Onglet sous Contrôles d'emplacement.
user914425