如何在Android模拟器中模拟GPS位置?

我想获得Android模拟器的经度和纬度进行testing。

任何人都可以指导我如何实现这一目标?

如何将模拟器的位置设置为testing位置?

您可以通过Telnet连接到模拟器。 然后你有一个模拟器控制台,让你input某些数据,如地理修复,networking等

这里详细解释如何使用控制台。 要连接到控制台,请打开命令行并键入

telnet localhost 5554 

然后,您可以使用geo命令来设置设备上的纬度,经度和高度(如果需要,将使用gps位置提供程序传递给所有程序)。 请参阅上面的链接进一步的说明。

在控制台中运行的具体命令是

 geo fix <longitude value> <latitude value> 

我发现这个网站很有用的find一个现实的纬度/经度: http : //itouchmap.com/latlong.html

如果你需要多一个坐标,你可以使用一个kml文件和一个path,在本文中有一点描述。 目前我找不到更好的来源。

我正在寻找一个更好的方法来设置模拟器的GPS坐标,而不是使用geo fix和手动确定具体的纬度和经度坐标。

无法find任何东西,我放了一个小程序,使用GWT和谷歌地图API来启动一个基于浏览器的地图工具来设置模拟器中的GPS位置:

Android的全球定位系统模拟器

希望能帮助那些无疑会偶然遇到这个困难/问题的人。

Android的全球定位系统模拟器

如果您使用的是Eclipse ,请转到Window->Open Perspective->DDMS ,然后在Location Controlsinput一个,然后点击Send

对于Android Studio用户:

运行模拟器,

然后,转到Tools -> Android ->Android device monitor

打开“ Emulator Control选项卡,然后使用位置控制组。

假设你已经设置并运行了一个mapview:

 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(); } }); 

您需要清单中的以下权限:

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

并从Eclipse发送模拟坐标到模拟器,转到“窗口”菜单,select“显示视图”>“其他”>“模拟器控制”,并可以从出现的模拟器控制面板发送坐标。

对于新的模拟器:

http://developer.android.com/tools/devices/emulator.html#extended

基本上,单击模拟器控件中的三个点button(在模拟器的右侧),它将打开一个菜单,使您可以控制包括位置的模拟器

1. Android Studio用户。

运行模拟器后转到工具 – > Android-> Android设备监视器

点击位置控制组中的模拟器控制选项卡更改。

2. Eclipse用户。

首先在Eclipse中在菜单中select“Window”,然后select“Open Perspective”,然后select“DDMS”。 即Window-> Open-Preference-> DDMS。

你会看到在左侧的设备面板和右侧,你会看到不同的标签。 select“Emulator Control”选项卡。

在底部你会看到位置控制面板。 select“手动”选项卡。

在文本框中input经度和纬度,然后单击发送button。 它将把你的位置发送给你的模拟器和应用程序。

3.使用telnet。

在运行命令中inputthis。

 telnet localhost 5554 

如果你不使用Windows,你可以使用任何telnet客户端。

使用telnet连接后,使用以下命令将您的位置发送到模拟器。

 geo fix long lat geo fix -121.45356 46.51119 4392 

4.使用基于浏览器的Google地图工具

有一个程序使用GWT和Google Maps API来启动一个基于浏览器的地图工具来设置模拟器中的GPS位置:

Android的全球定位系统模拟器

在仿真器控制台中使用“geo”命令

从命令行发送模拟位置数据:

  1. 在Android模拟器中启动您的应用程序,并在SDK的/ tools目录中打开一个terminal/控制台。

  2. 连接到仿真器控制台:

    telnet localhost 5555 (用模拟器运行的任何端口replace5555)

  3. 发送位置数据:* geo修复发送一个固定的地理位置。

    该命令接受十进制度的经度和纬度,以米为单位的可选高度。 例如:

     geo fix -121.45356 46.51119 4392 

我写了一个python脚本,通过telnet将gps位置推送到模拟器。 它定义了一个源和一个目标位置。 还有一个时间偏移,它允许您控制坐标将被推送到设备的时间。 一个位置是beeing每秒一次。

在下面的示例中,剧本在120秒内从柏林移动到汉堡。 每秒一步/ GPS位置,随机距离。

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

我使用eclipse插件DDMSfunction发送GPS。 在这里输入图像描述

在Mac,Linux或Cygwin中:

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

那会让你在墨西哥城。 相应地改变你的经度/纬度/高度。 如果你对nmea不感兴趣,那应该就够了。

请参阅获取用户位置

查看提供模拟位置数据 。 你会find它的解决scheme。

首先进入你的eclipse中的DDMS部分比打开模拟器控制….转到手动部分设置经度和长,然后按发送button

在通信端口被阻塞的Linux中。 在android sdk导航terminal到platform-tools文件夹,然后触发这个命令:

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

这里没有人提到模拟器本身的解决scheme,所以对于未来的访问者,我想分享一下视觉效果。

首先,运行你的Android模拟器,点击下面的菜单button(3个点):

模拟器与菜单按钮

然后从左窗格中select位置并根据您的需要更改坐标。 按发送button后,更改将立即生效(我build议您打开谷歌地图更好的理解)。

在这里输入图像描述

Android Studio版本:2.3.3

我试图通过adb设置地理修复许多点,并不能让我的应用程序看到任何GPS数据。 但是当我尝试打开DDMS,select我的应用程序的进程,并通过模拟器控制选项卡发送坐标立即工作。

Dalvikdebugging监视器>select仿真器>仿真器控制选项卡>位置控件。

DDMS – android_sdk / tools / ddms或android_sdk / tools / monitor

如果你使用eclipse,然后使用模拟器控制器,你可以手动设置纬度和经度,并在模拟器中运行你的基于地图的应用程序

如果您使用Android Studio(1.3):

  • 点击菜单“工具”
  • “机器人”
  • “Android设备监视器”
  • 点击你当前的模拟器
  • 标签“模拟器控制”
  • 去“位置控制”并input经纬度

下面的解决scheme为我工作 – 打开命令行并写:

 adb emu geo fix [longtitude] [latitude] 

如果上述解决scheme不起作用。 尝试这个:

在你的android Manifest.xml里面,在应用标签的外面添加以下两个链接,当然在你的manifest标签里面

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

当模拟器运行没有Google API的Android图像时,我无法在模拟器上获得GPS修正。 只要我改变图像包含谷歌API所有这里提到的方式来获得GPS修复工作。

确保在创buildAVD时使用Google APIselect图像。

对于我自己的一个项目,我开发了一个在线服务,可以为Android模拟器提供模拟位置。

它使用geo nmea,而不是geo fix,除了lat / lon之外,它还可以设置速度,航向,精确时间等。

该服务需要nc(netcat)命令行实用程序,没有别的。

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

你可以使用像genymotion这样的模拟器,它可以让你灵活地模拟你现在的GPS位置等。

有一个名为“模拟位置插件”的Android Studio插件。 你可以用这个插件模拟多个点。 您可以在此链接中find详细的使用手册: Android Studio。 用模拟位置插件模拟多个GPS点

让阿尔贝托·高纳的答案成为一条线

 token=$(cat ~/.emulator_console_auth_token); cat <(echo -e "auth $token \n geo fix 96.0290791 16.9041016 \n exit") - | nc localhost 5554 

5554是adb devices显示的模拟器端口号。

如果adb emu工作,情况会更好。

已经提到的多次使用shell命令“ geo fix … ”的答案是正确的答案。 但是,如果您使用LocationClient.getLastLocation()来检索数据,值得一提的是它不会起作用。 LocationClient类使用Google Play服务来检索坐标。 对于我来说,一旦运行了仿真器地图应用程序后,开始工作。 在第一次启动时,你被要求允许谷歌应用程序访问你的位置,我猜是诀窍。

在eclipse中:

您可能需要拖动DDMS窗口。 “位置控制”位于“电话操作”下,可能会被正常大小的控制台视图隐藏(控制台,LogCat等栏可能会覆盖它!)

无法评论,所以更新@ectomorphs答案在这里,当telneting现在需要有一个身份validation令牌。 在/home/username/.emulator_console_auth_token下的linux中

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

从shell脚本可以像这样设置坐标

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

我已经做了一个类似于以前的答案的脚本,但使用expect而不是python – 因为它有点简单( expect是为此而发明的)。

 #!/usr/bin/expect set port [lindex $argv 0] set lon [lindex $argv 1] set lat [lindex $argv 2] set timeout 1 spawn telnet localhost $port expect_after eof { exit 0 } ## interact expect OK set fp [open "~/.emulator_console_auth_token" r] if {[gets $fp line] != -1} { send "auth $line\r" } send "geo fix $lon $lat\r" expect OK send "exit\r" 

例如: sendloc 5554 2.35607 48.8263