繁体   English   中英

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

[英]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 文件。 从谷歌地图方向链接创建这个文件非常容易:

  1. 转到谷歌地图,选择一个位置,然后按“路线”并输入第二个位置。
  2. 创建路由后,从浏览器复制一个链接
  3. 转到此网站: https : //mapstogpx.com并将链接粘贴到“Let's Go”框
  4. 按“Let's Go”按钮,将下载 GPX 文件

使用“加载 GPS/KML”按钮将创建的文件加载到您的模拟器,选择速度,然后按底部的绿色播放按钮。 位置将实时发送,如下图所示。

在此处输入图片说明

我正在寻找一种比使用geo fix和手动确定特定纬度和经度坐标更好的方法来设置模拟器的 GPS 坐标。

找不到任何东西,我整理了一个使用 GWT 和 Google Maps API 的小程序来启动基于浏览器的地图工具来在模拟器中设置 GPS 位置:

android-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 位置:

android-gps-模拟器

最后,随着最新版本的 Android Studio 4 和他的新模拟器更新 10/23/2019,它变得更容易了。 启动您的模拟器并转到模拟器参数... > 在“路线”选项卡中,您可以选择地图上的两个点从/到并开始一条具有可调节播放速度的新路线,播放速度可以超过 1000 公里/小时!

在此处输入图片说明

以下解决方案对我有用 - 打开命令行并写入:

adb emu geo fix [longtitude] [latitude]

在模拟器控制台中使用“geo”命令

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

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

  2. 连接到模拟器控制台:

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

  3. 发送位置数据: * 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) 命令行实用程序,仅此而已。

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

您可以使用像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 studio->Tools menu->Android->Android Device Monitor->Emulator Tab->Location control-> 设置你需要的经纬度并根据你的需要检查你的项目

转到模拟中的Extended controls 之后您可以通过搜索或拖动地图到您要设置的位置来设置模拟的位置。

地点

最后点击SET LOCATION按钮保存。

我想在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 模拟器右侧的三个点和选择的位置选项卡时,我没有看到发送选项。 我试图设置一个位置点,但这并没有改变我默认的库比蒂诺位置。 打开谷歌地图,它会自动定位你,你的库比蒂诺位置会改变。

对 NecroPost 感到抱歉,但在遵循有关此问题的一些建议后,我将我的位置设置为阿拉斯加。 但是,我的设备仍然显示在加利福尼亚州山景城(Google 的总部?)。 所以这是我修复的方法:

1)进入位置设置:

在此处输入图片说明

2) 设置您的测试位置。 我选择了阿拉斯加。

在此处输入图片说明

3) 谷歌“我的当前位置”并点击图片中圈出的地图。 请注意,即使我将位置设置为阿拉斯加,我的虚拟设备仍然认为它位于加利福尼亚州的山景城。

在此处输入图片说明

4) 单击此位置图标您的位置现在应该会在您的设备上更新。 您可以再次通过谷歌搜索“我的当前位置”进行验证。

在此处输入图片说明

如果有人遇到过同样的问题,希望我的解决方案对您有所帮助。

对于 BlueStack 用户:打开模拟器并按Ctrl + Shift + K然后找到您的位置并按set location

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM