我想在 Android 模拟器中获取经度和纬度进行测试。
谁能指导我如何实现这一目标?
如何将模拟器的位置设置为测试位置?
您可以通过 Telnet 连接到模拟器。然后,您有一个模拟器控制台,可让您输入某些数据,如地理修复、网络等。
详细解释了如何使用控制台here。要连接到控制台,请打开命令行并键入
telnet localhost 5554
然后,您可以使用 geo 命令在设备上设置纬度、经度和高度(如果需要),使用 gps 位置提供程序将其传递给所有程序。有关更多说明,请参阅上面的链接。
在控制台中运行的具体命令是
geo fix <longitude value> <latitude value>
我发现这个网站对于找到一个现实的纬度/经度很有用:http://itouchmap.com/latlong.html
如果您需要多个坐标,您也可以使用带有路线的 kml 文件,此 article 中对此进行了一些描述。目前我找不到更好的来源。
这里没有人提到模拟器本身的内置解决方案,所以对于未来的访问者,我想与视觉分享。
首先,运行您的 Android 模拟器并单击如下所示的菜单按钮(3 个点):
https://i.stack.imgur.com/zwZ8N.png
然后从左侧窗格中,选择位置并根据需要更改坐标。按下发送按钮后,更改将立即生效(我建议您打开谷歌地图以便更好地理解)。
https://i.stack.imgur.com/6PBAV.png
安卓工作室版本:2.3.3
此外,为了使您的不同位置实时进入您的应用程序,您可以使用 GPX 文件。从谷歌地图方向链接创建这个文件非常容易:
转到谷歌地图,选择一个位置,然后按“路线”并输入第二个位置。创建路线后,从浏览器复制一个链接 转到此网站:https://mapstogpx.com 并将链接粘贴到“Let's Go”框按“Let's Go”按钮,将下载 GPX 文件
使用“加载 GPS/KML”按钮将创建的文件加载到您的模拟器,选择速度,然后按底部的绿色播放按钮。位置将实时发送,如下图所示。
https://i.stack.imgur.com/CGGmc.png
changes will immediately take effect
虽然这是真的,但我实际上需要打开一次 GoogleMaps 才能更新位置。 (在此之后 GMaps 不需要保持打开状态)没有打开 GMaps 一次,我的应用程序没有获得更新的位置......
我正在寻找一种更好的方法来设置模拟器的 GPS 坐标,而不是使用 geo fix
并手动确定特定的纬度和经度坐标。
找不到任何东西,我编写了一个小程序,它使用 GWT 和 Google Maps API 来启动基于浏览器的地图工具来在模拟器中设置 GPS 位置:
希望它可以帮助那些无疑也会遇到这个困难/问题的人。
https://dpdearing.github.io/android-gps-emulator/img/android-gps-emulator-cropped.png
ConnectionRefused
消息。在我的浏览器顶部,它还显示“在端口 5554 上建立连接时出错……”如果我单击“更改模拟器端口”按钮重新连接,一切正常
geo fix 42,42 42,42 42
逗号而不是点。
如果您使用 Eclipse
,请转到 Window->Open Perspective->DDMS
,然后在 Location Controls
中输入一个并点击 Send
。
LocationManager mlocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Location location = mlocManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
Unable to send command to the emulator
时出现以下错误。知道为什么它不起作用吗?我正在使用默认的 Nexus 4 AVD
对于 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 向模拟器发送模拟坐标,请转到“窗口”菜单,选择“显示视图”>“其他”>“模拟器控件”,然后您可以从出现的模拟器控制窗格中发送坐标。
runOnFirstFix
中使用它吗?因为这是设备首次接收 GPS 位置时引发的事件,所以如果曾经引发,getMyLocation
肯定会返回一个值。
对于新的模拟器:
http://developer.android.com/tools/devices/emulator.html#extended
基本上,单击模拟器控件中的三个点按钮(模拟器右侧),它将打开一个菜单,允许您控制模拟器,包括位置
1. Android Studio 用户。
运行模拟器后转到 Tools->Android->Android device monitor
单击位置控件组中的 Emulator Control Tab 更改。
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 位置:
最后,随着最新版本的 Android Studio 4 和他的新模拟器更新 10/23/2019,它变得更加容易。启动您的模拟器并转到模拟器参数... > 在“路线”选项卡中,您可以选择地图上的两个点从/到并开始一条可调节播放速度的新路线,可超过 1000 公里/小时!
https://i.stack.imgur.com/hidEg.png
以下解决方案对我有用 - 打开命令行并编写:
adb emu geo fix [longtitude] [latitude]
在模拟器控制台中使用“geo”命令
从命令行发送模拟位置数据:
在 Android 模拟器中启动您的应用程序并在您的 SDK 的 /tools 目录中打开一个终端/控制台。连接到模拟器控制台:telnet localhost 5555(用运行模拟器的任何端口替换 5555) 发送位置数据:* geo fix 发送固定的地理位置。此命令接受十进制度的经度和纬度,以及以米为单位的可选高度。例如:地理修复 -121.45356 46.51119 4392
很抱歉 NecroPost,但在遵循有关此问题的一些建议后,我将我的位置设置为阿拉斯加。但是,我的设备仍显示在加利福尼亚山景城(谷歌总部?)。因此,这是我进行修复的方法:
1)进入位置设置:
https://i.stack.imgur.com/ABfAA.png
2) 设置您的测试位置。我选择了阿拉斯加。
https://i.stack.imgur.com/KFpik.png
3) 谷歌“我的当前位置”并点击图中圈出的地图。请注意,即使我将位置设置为阿拉斯加,我的虚拟设备仍然认为它在加利福尼亚州的山景城。
https://i.stack.imgur.com/t8Aj6.png
4) 单击此位置图标 您的位置现在应该在您的设备上更新。您可以再次通过谷歌搜索“我的当前位置”进行验证。
https://i.stack.imgur.com/9SGoJ.png
如果有人遇到过同样的问题,希望我的解决方案对您有所帮助。
我编写了一个 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 不感兴趣,这应该足够了。
https://i.stack.imgur.com/eKaH2.png
在通信端口被阻塞的 Linux 中。将终端导航到 android sdk
内的 platform-tools 文件夹并触发以下命令:
./adb -s #{device_name} emu geo fix #{longitude} #{latitude}
首先在 Eclipse 中进入 DDMS 部分,然后打开模拟器控制 .... 转到手动部分设置纬度和经度,然后按发送按钮
我试图通过 adb 为许多点设置地理修复,但无法让我的应用程序查看任何 GPS 数据。但是当我尝试打开 DDMS,选择我的应用程序的进程并通过模拟器控制选项卡发送坐标时,它立即工作。
Dalvik 调试监视器 > 选择模拟器 > 模拟器控制选项卡 > 位置控制。
DDMS -- android_sdk/tools/ddms 或 android_sdk/tools/monitor
如果您使用的是 eclipse 然后使用模拟器控制器,您可以手动设置纬度和经度并在模拟器中运行基于地图的应用程序
如果您使用的是 Android Studio (1.3):
点击菜单“工具”
“安卓”
“安卓设备监视器”
点击你当前的模拟器
选项卡“模拟器控制”
转到“位置控制”并输入纬度和经度
只需将 Alberto Gauna 的答案写成一行
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. Simulate multiple GPS points with Mock Location Plugin
还不能发表评论,所以在这里更新@ectomorphs 答案,现在远程登录时需要有一个身份验证令牌。在 /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
geo fix
命令仅在您先auth
时可用。可能值得一提...