
[英]How to emulate an exact LatLng GPS location in the Android Emulator
[英]How to emulate GPS location in the Android Emulator?
我想在Android模拟器中获取经纬度进行测试。
谁能指导我如何实现这一目标?
如何将模拟器的位置设置为测试 position?
您可以通过 Telnet 连接到仿真器。 然后你有一个模拟器控制台,可以让你输入某些数据,比如地理定位、网络等。
此处详细解释 了如何使用控制台。 要连接到控制台,请打开命令行并键入
telnet localhost 5554
然后,您可以使用 geo 命令在设备上设置纬度、经度和海拔(如果需要),这些海拔高度会通过 gps 位置提供程序传递给所有程序。 有关进一步说明,请参阅上面的链接。
在控制台中运行的具体命令是
geo fix <longitude value> <latitude value>
我发现这个网站对于找到一个真实的 lat/lng 很有用: http : //itouchmap.com/latlong.html
如果您需要多个坐标,您也可以使用带有路线的 kml 文件, 本文对此进行了一些描述。 我目前找不到更好的来源。
这里没有人提到模拟器本身的内置解决方案,因此对于未来的访问者,我想通过视觉效果分享它。
首先,运行您的 Android 模拟器并单击如下所示的菜单按钮(3 个点):
然后从左窗格中选择位置并根据需要更改坐标。 按下发送按钮后,更改将立即生效(建议您打开谷歌地图以便更好地理解)。
安卓工作室版本:2.3.3
此外,为了让您的不同位置实时进入您的应用程序,您可以使用 GPX 文件。 从谷歌地图方向链接创建这个文件非常容易:
使用“加载 GPS/KML”按钮将创建的文件加载到您的模拟器,选择速度,然后按底部的绿色播放按钮。 位置将实时发送,如下图所示。
我正在寻找一种比使用geo fix
和手动确定特定纬度和经度坐标更好的方法来设置模拟器的 GPS 坐标。
找不到任何东西,我整理了一个使用 GWT 和 Google Maps API 的小程序来启动基于浏览器的地图工具来在模拟器中设置 GPS 位置:
希望它可以帮助那些毫无疑问也会遇到这个困难/问题的人。
如果您使用的是Eclipse
,请转到Window->Open Perspective->DDMS
,然后在Location Controls
键入一个并点击Send
。
对于 Android Studio 用户:
运行模拟器,
然后,转到Tools -> Android ->Android device monitor
打开Emulator Control
选项卡,并使用位置控制组。
假设您已经设置并运行了一个地图视图:
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 向模拟器发送模拟坐标,请转到“窗口”菜单,选择“显示视图”>“其他”>“模拟器控件”,您可以从出现的模拟器控制面板发送坐标。
对于新模拟器:
http://developer.android.com/tools/devices/emulator.html#extended
基本上,单击模拟器控件中的三个点按钮(模拟器右侧),它将打开一个菜单,允许您控制模拟器,包括位置
1. Android Studio 用户。
运行模拟器后转到 Tools->Android->Android device monitor
单击位置控制组中的模拟器控制选项卡更改。
2. Eclipse 用户。
首先在Eclipse中的菜单中选择“Window”,然后选择“Open Perspective”,然后选择“DDMS”。 即窗口->打开预定义->DDMS。
您将在左侧设备面板和右侧看到不同的选项卡。 选择“模拟器控制”选项卡。
在底部,您将看到位置控制面板。 选择“手动”选项卡。
在文本框中输入经度和纬度,然后单击发送按钮。 它会将位置发送给您的模拟器和应用程序。
3. 使用远程登录。
在运行命令中输入这个。
telnet localhost 5554
如果您不使用 Windows,您可以使用任何 telnet 客户端。
与 telnet 连接后,使用以下命令将您的位置发送到模拟器。
geo fix long lat
geo fix -121.45356 46.51119 4392
4. 使用基于浏览器的谷歌地图工具
有一个程序使用 GWT 和 Google Maps API 来启动基于浏览器的地图工具来在模拟器中设置 GPS 位置:
以下解决方案对我有用 - 打开命令行并写入:
adb emu geo fix [longtitude] [latitude]
在模拟器控制台中使用“geo”命令
从命令行发送模拟位置数据:
在 Android 模拟器中启动您的应用程序并在您的 SDK 的 /tools 目录中打开一个终端/控制台。
连接到模拟器控制台:
telnet localhost 5555
(用模拟器运行的任何端口替换 5555)
发送位置数据: * geo fix 发送固定的地理位置。
此命令接受以十进制度数表示的经度和纬度,以及以米为单位的可选高度。 例如:
geo fix -121.45356 46.51119 4392
我编写了一个 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()
在 Mac、Linux 或 Cygwin 中:
echo 'geo fix -99.133333 19.43333 2202' | nc localhost 5554
那会让你在墨西哥城。 相应地更改您的经度/纬度/高度。 如果您对 nmea 不感兴趣,那应该就足够了。
我使用eclipse插件DDMS功能发送GPS。
在 Linux 中,通信端口被阻止。 将终端导航到android sdk
platform-tools 文件夹并执行以下命令:
./adb -s #{device_name} emu geo fix #{longitude} #{latitude}
首先进入 Eclipse 中的 DDMS 部分,然后打开模拟器控制 .... 转到手动部分设置经纬度,然后按发送按钮
Dalvik 调试监视器 > 选择模拟器 > 模拟器控制选项卡 > 位置控制。
DDMS -- android_sdk/tools/ddms 或 android_sdk/tools/monitor
我试图通过 adb 为许多点设置地理定位,但无法让我的应用程序查看任何 GPS 数据。 但是当我尝试打开 DDMS,选择我的应用程序的进程并通过模拟器控制选项卡发送坐标时,它立即起作用。
如果您使用的是 eclipse 然后使用模拟器控制器,您可以手动设置纬度和经度并在模拟器中运行基于地图的应用程序
如果您使用的是 Android Studio (1.3):
只需将 Alberto Gaona 的答案写成一行
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
工作会更好。
如果上述解决方案不起作用。 尝试这个:
在您的 android Manifest.xml 中,在应用程序标签的外部添加以下两个链接,但当然是在您的清单标签内
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" ></uses-permission>
<uses-permission android:name="android.permission.INTERNET" ></uses-permission>
当模拟器在没有 Google API 的情况下运行 Android 图像时,我无法在模拟器上获得 GPS 修复。 一旦我将图像更改为包含 Google API,这里提到的所有获得 GPS 修复的方法都有效。
确保在创建 AVD 时选择带有 Google API 的图像。
已经多次提到使用 shell 命令“ geo fix... ”的答案是正确的答案。 但是,如果您使用LocationClient.getLastLocation()来检索您的数据,值得一提的是它一开始不会工作。 LocationClient 类使用 Google Play 服务来检索坐标。 对我来说,这在运行模拟器地图应用程序一次后开始工作。 在第一次开始时,您会被要求允许谷歌应用程序访问您的位置,我想这可以解决问题。
对于我自己的一个项目,我开发了一个在线服务,可以为 Android 模拟器提供模拟位置。
它使用 geo nmea 而不是 geo fix,这允许它设置速度、路线、精确时间等,而不仅仅是纬度/经度。
该服务需要 nc (netcat) 命令行实用程序,仅此而已。
您可以使用像genymotion这样的模拟器,它可以让您灵活地模拟您当前的 GPS 位置等。
Android Studio 有一个名为“Mock Location Plugin”的插件。 您可以使用此插件模拟多个点。 您可以在此链接中找到详细的使用手册: Android Studio。 使用 Mock Location Plugin 模拟多个 GPS 点
还不能发表评论,所以在这里更新 @ectomorphs 答案,现在 telnet 需要有一个 auth 令牌。 在 /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
我想在Android模拟器中获取经度和纬度以进行测试。
谁能指导我如何实现这一目标?
如何将仿真器的位置设置为测试位置?
我制作了一个类似于以前的答案之一的小脚本,但是使用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
用法: sendloc 5554 2.35607 48.8263
我在 Android studio 3.5.1 上遇到了同样的问题 当我点击 android 模拟器右侧的三个点和选择的位置选项卡时,我没有看到发送选项。 我试图设置一个位置点,但这并没有改变我默认的库比蒂诺位置。 打开谷歌地图,它会自动定位你,你的库比蒂诺位置会改变。
对于 BlueStack 用户:打开模拟器并按Ctrl + Shift + K然后找到您的位置并按set location
!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.