Comment émuler l'emplacement GPS dans l'émulateur Android?



Answers

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

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 cartographique basé sur un navigateur pour définir l'emplacement GPS dans l'émulateur:

android-gps-emulator

Nous espérons qu'il sera utile d'aider d'autres personnes qui trébucheront sans aucun doute sur cette difficulté / question.

android-gps-emulator

Question

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

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

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




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

À l'intérieur de votre fichier Manifest.xml, 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>



Impossible de commenter pour le moment, donc la mise à jour de @ectomorphs répond ici, ce qui est nécessaire lorsque telneting a besoin d'un jeton auth. Sous linux, 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()

A partir d'un script shell, on peut définir le coorinate comme si

#!/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



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 scénario passe 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()



En supposant que vous ayez un mapview mis en place et en cours d'exécution:

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 fictives à 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 les coordonnées depuis le volet de contrôle de l'émulateur qui apparaît.




Pour les utilisateurs d'Android Studio:

lance l'émulateur,

Ensuite, allez dans Tools -> Android ->Android device monitor

Ouvrez l'onglet Emulator Control l' Emulator Control et utilisez le groupe de contrôles d'emplacement.




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

./adb -s #{device_name} emu geo fix #{longitude} #{latitude}






La solution suivante a fonctionné pour moi - ligne de commande ouverte et écrire:

adb emu geo fix [longtitude] [latitude]



Dalvik Debug Monitor> Sélectionner l'émulateur> Onglet Contrôle de l'émulateur> Contrôles de position.

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







Pour un projet de mon cru, j'ai développé un service en ligne qui peut fournir une localisation simulée à 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 de lat / lon.

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

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




1. Utilisateurs d'Android Studio.

Après avoir lancé l'émulateur, allez dans Outils-> Android-> Moniteur d'appareil Android

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

2. Utilisateurs d'Eclipse.

First In Eclipse In Menu Sélectionnez "Window" puis "Open Perspective" puis "DDMS". par exemple Window-> Open Prespective-> DDMS.

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

En bas, vous verrez le panneau de contrôle 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 va envoyer la position à vous émulateur et l'application.

3. Utilisation de telnet.

Dans la commande d'exécution, 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 Google Maps basé sur un navigateur

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

android-gps-emulator




La réponse multiple mentionnée précédemment pour 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 utile 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 l'exécution de l'application des cartes émulateurs une fois. Lors du premier démarrage, il vous est demandé d'autoriser Google Apps à accéder à votre position, ce qui, je pense, est efficace.




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



Links