如何在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的全球定位系统模拟器
希望能帮助那些无疑会偶然遇到这个困难/问题的人。
如果您使用的是Eclipse
,请转到Window->Open Perspective->DDMS
,然后在Location Controls
input一个,然后点击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”命令
从命令行发送模拟位置数据:
-
在Android模拟器中启动您的应用程序,并在SDK的/ tools目录中打开一个terminal/控制台。
-
连接到仿真器控制台:
telnet localhost 5555
(用模拟器运行的任何端口replace5555) -
发送位置数据:* 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)命令行实用程序,没有别的。
你可以使用像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