testing emulator - Comment émuler l'emplacement GPS dans l'émulateur Android?



not working (25)

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?


Answers

Vous pouvez vous connecter à l'émulateur via Telnet. Vous avez ensuite une console Emulator qui vous permet d'entrer certaines données comme des géolocalisations, un réseau, etc.

Comment utiliser la console est largement expliqué here . 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 la latitude, la longitude et, si nécessaire, l'altitude sur l'appareil qui est transmise à tous les programmes à l'aide du fournisseur d'emplacement 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 aussi utiliser un fichier kml avec une route, il est un peu décrit dans cet article . Je ne peux pas trouver une meilleure source pour le moment.



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/


Impossible d'obtenir une correction GPS sur l'émulateur lorsque l'émulateur exécutait une image Android sans API Google. Dès que j'ai changé l'image pour contenir des API Google, tous les moyens mentionnés ci-dessus pour obtenir une solution GPS ont fonctionné.

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


Si vous utilisez Eclipse , allez dans Window->Open Perspective->DDMS , puis tapez un dans les Location Controls et Location Controls sur Send .


J'utilise la fonction DDMS de la prise eclipse pour envoyer le GPS.


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}

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


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.


Sous Mac, Linux ou Cygwin:

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

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


Si vous utilisez eclipse, 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.


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.


Vous pouvez utiliser un émulateur comme genymotion qui vous donne la genymotion d'émuler votre position GPS actuelle, etc.


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 Android Emulator et cliquez sur le bouton de menu (3 points) ci-dessous:

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

Version Android Studio: 2.3.3


Ouvrez le studio Android-> Menu Outils-> Android-> Moniteur de périphérique Android-> onglet Emulateur-> Contrôle de localisation-> Définissez la latitude et la longitude requises et vérifiez votre projet selon vos besoins


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


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.


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

adb emu geo fix [longtitude] [latitude]

Il suffit de faire 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 les adb devices .

Il aurait été préférable que adb emu fonctionne.


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'essayais de régler le géolocalisation via adb pour de nombreux points et je ne pouvais pas obtenir mon application pour voir les données GPS. Mais quand j'ai essayé d'ouvrir DDMS, en sélectionnant le processus de mon application et les coordonnées d'envoi à travers l'onglet de contrôle de l'émulateur, cela a fonctionné tout de suite.


Dès l’API 21 (le premier SDK Android 5.0 / Lollipop) , il détecte si l’application Goat Simulator est installée:

/**
 * Used to determine whether the user making this call is subject to
 * teleportations.
 *
 * <p>As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method can
 * now automatically identify goats using advanced goat recognition technology.</p>
 *
 * @return Returns true if the user making this call is a goat.
 */
public boolean isUserAGoat() {
    return mContext.getPackageManager()
            .isPackageAvailable("com.coffeestainstudios.goatsimulator");
}

Cela devrait indiquer clairement que la suggestion de djechlin de l'utiliser comme un système sans avertissement if (false) est une stratégie potentiellement désastreuse. Ce qui était précédemment renvoyé par false pour chaque périphérique renvoie maintenant une valeur apparemment aléatoire: si cela était enfoui suffisamment profondément dans votre code, il pourrait prendre beaucoup de temps pour déterminer la provenance de vos nouveaux bogues.

En bout de ligne: si vous ne contrôlez pas la mise en œuvre d'une méthode et décidez de l'utiliser à des fins autres que celles indiquées dans la documentation de l'API, vous vous dirigez vers des problèmes.





android testing android-emulator geolocation