我想在Android模拟器中获得经度和纬度进行测试。
有谁能指导我如何实现这个目标吗?
如何将模拟器的位置设置为测试位置?
假设你已经设置并运行了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向模拟器发送模拟坐标,请转到“窗口”菜单,选择“显示视图”>“其他”>“模拟器控件”,您可以从出现的模拟器控制窗格中发送坐标。
您可以通过Telnet连接到模拟器。然后你有一个模拟器控制台,允许你输入特定的数据,如地理定位,网络等。
如何使用控制台被广泛地解释在这里。 要连接到控制台,打开命令行并键入
telnet localhost 5554
然后,您可以使用geo命令在设备上设置纬度、经度以及(如果需要的话)海拔高度,该设备将通过gps位置提供程序传递给所有程序。请参阅上面的链接以获得进一步的说明。
要在控制台中运行的特定命令为
geo fix <longitude value> <latitude value>
我发现这个网站有助于找到一个现实的纬度/液化天然气:http://itouchmap.com/latlong.html
如果你需要一个以上的坐标,你也可以使用一个kml文件和一个路由,它在文章中有一点描述。我现在找不到更好的消息来源了。
我试图通过adb为许多点设置地理定位,但无法让我的应用程序看到任何GPS数据。但当我尝试打开DDMS时,选择我的应用程序的进程并通过模拟器控制选项卡发送坐标,它马上就工作了。
我正在寻找一种更好的方法来设置模拟器的GPS坐标,而不是使用geo fix和手动确定特定的纬度和经度坐标。
geo fix
找不到任何东西,我把一个小程序,使用GWT和谷歌Maps API来启动一个基于浏览器的地图工具,在模拟器中设置GPS位置:
android-gps-emulator
希望它能帮助那些无疑也会遇到这个困难/问题的人。
在模拟器控制台中使用"geo"命令
从命令行发送模拟位置数据:
在Android模拟器中启动你的应用程序,在SDK的/tools目录中打开一个终端/控制台。
telnet localhost 5555(将5555替换为模拟器正在运行的任何端口)
telnet localhost 5555
发送位置数据 *发送一个固定的地理位置
该命令接受以十进制为单位的经度和纬度,以及以米为单位的可选海拔。例如:
geo fix -121.45356 46.51119 4392
如果你正在使用Eclipse,转到Window->Open Perspective->DDMS,然后在Location Controls中键入1并点击Send。
Eclipse
Window->Open Perspective->DDMS
Location Controls
Send
看到获取用户位置信息
在提供模拟位置数据下查找。你会找到解决方法的。
如果上述解决方案不奏效。试试这个:
在你的android manifest .xml中,添加以下两个链接外的应用程序标签,当然是在你的manifest标签中
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" ></uses-permission> <uses-permission android:name="android.permission.INTERNET" ></uses-permission>
当模拟器在没有谷歌api的情况下运行Android图像时,我无法在模拟器上获得GPS定位。只要我改变图像包含谷歌api,这里提到的所有方法得到GPS固定工作。
在创建AVD时,请确保选择带有谷歌api的图像。
1. Android Studio用户。
运行模拟器后,进入Tools->Android->Android设备监视器
从位置控件组中单击“模拟器控件”选项卡更改。
2. Eclipse用户。
在Eclipse的菜单中选择“window”;然后选择“Open perspective”;然后选择“DDMS" 即窗口->开放透视->DDMS.
您将在左侧设备面板和右侧看到不同的选项卡。 选择“模拟器控制”;选项卡。< / p > 在底部你会看到位置控制面板。 选择“Manual"选项卡。< / p >
在文本框中输入经度和纬度,然后单击发送按钮。 它将把位置发送给你的模拟器和应用程序
3.使用telnet。
在run命令中键入this。
如果您不使用windows,您可以使用任何telnet客户端。
连接到telnet后,使用以下命令将您的位置发送到模拟器。
geo fix long lat geo fix -121.45356 46.51119 4392
4. 使用基于浏览器的谷歌地图工具
有一个程序使用GWT和谷歌Maps API来启动一个基于浏览器的地图工具来设置模拟器中的GPS位置:
Dalvik Debug Monitor >选择模拟器>模拟器控制选项卡>位置控制。
DDMS——android_sdk/tools/ DDMS或android_sdk/tools/monitor
我使用eclipse插件DDMS功能发送GPS。
前面提到的多次使用shell命令的答案“geo修复……”是正确答案。 但如果你使用LocationClient.getLastLocation ()来检索你的数据,值得一提的是,它在一开始不会工作。LocationClient类使用谷歌Play Service来检索坐标。 对我来说,这开始工作后运行模拟器地图应用程序一次。在第一次启动时,你会被要求允许谷歌个应用程序访问你的位置,我想这是可行的
在Linux系统中,通信端口被阻塞。将终端导航到android sdk内的platform-tools文件夹,并触发以下命令:
android sdk
./adb -s #{device_name} emu geo fix #{longitude} #{latitude}
如果你正在使用eclipse,然后使用模拟器控制器,你可以手动设置纬度和经度,并在模拟器中运行基于地图的应用程序
在eclipse中:
您可能需要向下拖动DDMS窗口。 “Location Controls”位于“Telephony Actions”下,可能被一个正常大小的控制台视图隐藏(带有控制台,LogCat等的栏可能会覆盖它!)
~
对于Android Studio用户:
运行模拟器,
然后,转到Tools -> Android ->Android device monitor
Tools -> Android ->Android device monitor
打开Emulator Control选项卡,并使用位置控件组。
Emulator Control
在我自己的一个项目中,我开发了一个在线服务,可以为Android模拟器提供模拟位置。
它使用geo nmea而不是geo fix,这使得它可以设置速度,航线,精确的时间等,除了纬度/长度。
该服务只需要nc (netcat)命令行工具,不需要其他工具。
http://www.kisstech.ch/nmea/
在Mac、Linux或Cygwin系统下:
echo 'geo fix -99.133333 19.43333 2202' | nc localhost 5554
这样你就能到墨西哥城了。相应地改变你的经度/纬度/高度。如果你对nmea不感兴趣,这应该足够了。
我写了一个python脚本,通过telnet将gps位置推到模拟器。它定义了源位置和目标位置。还有一个时间偏移,它可以让你控制坐标将被推送到设备的时间。一个位置每秒推送一次。
在下面的例子中,脚本在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()
如果你使用Android Studio (1.3):
对于新的模拟器:
http://developer.android.com/tools/devices/emulator.html#extended
基本上,点击模拟器控件中的三个点按钮(模拟器的右侧),它将打开一个菜单,允许你控制模拟器,包括位置
你可以使用像genymotion这样的模拟器,它可以灵活地模拟你当前的GPS位置等。
还不能评论,所以更新@ectomorphs回答在这里,当telneting现在需要一个认证令牌。在linux中,它在/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()
在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
下面的解决方案对我有用——打开命令行,然后写:
adb emu geo fix [longtitude] [latitude]
把阿尔贝托·高纳的回答写在一行里
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 devices
如果adb emu工作的话会更好。
adb emu
这里没有人提到模拟器本身的内置解决方案,所以对于未来的访问者,我想用视觉效果来分享它。
首先,运行你的Android模拟器,点击菜单按钮(3点)如下所示:
然后在左侧窗格中,选择位置并根据需要更改坐标。在按下发送按钮后,更改将立即生效(我建议你打开谷歌Maps以便更好地理解)。
Android Studio版本:2.3.3
此外,为了使不同的位置实时到达应用程序,可以使用GPX文件。从谷歌地图方向创建这个文件非常简单:
使用“加载GPS/KML”按钮将创建的文件加载到模拟器中,选择速度,并按底部的绿色播放按钮。如下图所示,位置将实时发送。
我已经做了一个小脚本类似于前面的答案之一,但使用expect而不是python -因为它更简单一点(expect是为此发明的)。
expect
python
#!/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
sendloc 5554 2.35607 48.8263
小开 最后,随着最新发布的Android Studio 4和他的新模拟器更新2019年10月23日,它变得更容易了。 启动模拟器,进入模拟器参数…>在“路线”选项卡,你可以选择地图上的两个点,从/到,开始一个新的路线,播放速度可调,可以达到1000公里/小时以上!< / p >
在模拟器中进入Extended controls。之后,您可以通过搜索或拖动映射到要设置的位置来设置模拟的位置。
Extended controls
最后点击SET LOCATION按钮保存。
SET LOCATION
对不起,在这个问题上的一些建议之后,我把我的位置设置为阿拉斯加。然而,我的设备仍然显示在加州山景城(谷歌的总部?)下面是我的修复方法:
1)进入位置设置:
2)设置测试地点。我选择了阿拉斯加。
3)谷歌“我现在的位置”;然后点击图中圈出来的地图。 请注意,即使我将位置设置为阿拉斯加,我的虚拟设备仍然认为它在加州山景城
4)点击这个位置图标 您的位置现在应该在您的设备上更新。 你可以通过谷歌搜索“我的当前位置”来验证。一次。< / p >
如果有人遇到同样的问题,我希望我的解决方案能帮助到你。