ChatGPT解决这个技术问题 Extra ChatGPT

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

我想在 Android 模拟器中获取经度和纬度进行测试。

谁能指导我如何实现这一目标?

如何将模拟器的位置设置为测试位置?

如果您使用 Genymotion:stackoverflow.com/questions/30709329/…
您可以在 Play 商店中安装众多模拟位置应用程序之一。

e
ezze

您可以通过 Telnet 连接到模拟器。然后,您有一个模拟器控制台,可让您输入某些数据,如地理修复、网络等。

详细解释了如何使用控制台here。要连接到控制台,请打开命令行并键入

telnet localhost 5554

然后,您可以使用 geo 命令在设备上设置纬度、经度和高度(如果需要),使用 gps 位置提供程序将其传递给所有程序。有关更多说明,请参阅上面的链接。

在控制台中运行的具体命令是

geo fix <longitude value> <latitude value>

我发现这个网站对于找到一个现实的纬度/经度很有用:http://itouchmap.com/latlong.html

如果您需要多个坐标,您也可以使用带有路线的 kml 文件,此 article 中对此进行了一些描述。目前我找不到更好的来源。


使用地理修复我还设置了模拟纬度和经度仍然得到空位置。
亚行鸸鹋地理修复 30.219470 -97.745361
请注意顺序,lon 在 lat 之前!
geo fix 命令仅在您先auth 时可用。可能值得一提...
在将位置和 GPX 文件添加到 Emulator 的 UI 后,此解决方案没有多大意义。请参阅下面的@eden 答案
O
Oleg Gryb

这里没有人提到模拟器本身的内置解决方案,所以对于未来的访问者,我想与视觉分享。

首先,运行您的 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


在这个解决方案中需要在模拟器中播放服务吗?
我确认无需登录您的 Google 帐户即可执行此操作。凉爽的!
我必须重新启动模拟操作系统才能让它识别新位置。
android studio 3.5.1 附带的 android 模拟器在位置选项卡中没有任何发送选项。有一个设置位置按钮,但在使用地理定位器包读取时它不会改变位置
changes will immediately take effect 虽然这是真的,但我实际上需要打开一次 GoogleMaps 才能更新位置。 (在此之后 GMaps 不需要保持打开状态)没有打开 GMaps 一次,我的应用程序没有获得更新的位置......
d
dpdearing

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

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

android-gps-emulator

希望它可以帮助那些无疑也会遇到这个困难/问题的人。

https://dpdearing.github.io/android-gps-emulator/img/android-gps-emulator-cropped.png


哇谢谢你!设置工作得很好,但我无法管理与模拟器的连接-> 日志打印 java.net.ConnectionRefused。然后我尝试了 telnet localhost 5554 (从终端),它工作了.. 有没有其他人在 mac 上成功测试过你的模拟器?
我没有测试它,但这看起来太棒了,我认为谷歌应该告诉全世界。简单的想法总是最好的。为什么没有人想到这一点?
@ottel142 - 是的,我实际上在没有这个问题的 Mac 上运行(在 Mavericks 上使用 Chrome)。如果我在启动 Android 虚拟设备之前启动 GPS 模拟器,我会看到该 ConnectionRefused 消息。在我的浏览器顶部,它还显示“在端口 5554 上建立连接时出错……”如果我单击“更改模拟器端口”按钮重新连接,一切正常
正是我需要的。
这是一个很好的程序,但是系统局部性改变了浮动的工作方式。在我的系统上,它必须像 geo fix 42,42 42,42 42 逗号而不是点。
I
Ibungo

如果您使用 Eclipse,请转到 Window->Open Perspective->DDMS,然后在 Location Controls 中输入一个并点击 Send


这是迄今为止我见过的最简单的方法。确保您设置了支持 GPS 的 AVD,然后在 DDMS 透视图中单击正在设备下运行的模拟器,选择右中窗格上的模拟器控制选项卡,然后在底部是 SteveCav 提到的位置控制部分(使用带有最新 ADT 的 Java 开发人员的 Eclipse Juno 4.2)。我的位置控制面板甚至预装了位置数据。
很好的答案!适用于任何 ide,因为 ddms 是 sdk 的一部分(yoursdkfolder/tools/)
这个,也不是上面的 telnet 解决方案,对我有用。我正在尝试这样获取我的位置,但它仍然为空。 LocationManager mlocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); Location location = mlocManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
当我在 DDMS 中使用“位置控制”时,尝试发送 Unable to send command to the emulator 时出现以下错误。知道为什么它不起作用吗?我正在使用默认的 Nexus 4 AVD
我无法执行此操作,位置控件显示为灰色
u
user1506104

对于 Android Studio 用户:

运行模拟器,

然后,转到 Tools -> Android ->Android device monitor

打开 Emulator Control 标签,然后使用位置控制组。


就我而言,所有文件都是不可编辑的。你有想法吗 ?
@MustafaOlkun 这可能意味着模拟器本身具有这些控件。在模拟器旁边寻找“...”。
我也有同样的问题。它们是不可编辑的。是的,有“...”。然而,当我把任何东西放在那里并发送时,应用程序没有任何变化......
D
David Hedlund

假设您已经设置并运行了一个地图视图:

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 向模拟器发送模拟坐标,请转到“窗口”菜单,选择“显示视图”>“其他”>“模拟器控件”,然后您可以从出现的模拟器控制窗格中发送坐标。


但是我的朋友经度和纬度在哪里?
我曾尝试使用此 ans 将模拟值发送到仿真器控件,但是当我按下发送按钮时,它没有做任何事情,没有任何消息出现确认发送与否的值。 seocnd 事物 GeoPoint g=myLocation.getMyLocation();正在返回空值。
您确定在 runOnFirstFix 中使用它吗?因为这是设备首次接收 GPS 位置时引发的事件,所以如果曾经引发,getMyLocation 肯定会返回一个值。
f
f.khantsis

对于新的模拟器:

http://developer.android.com/tools/devices/emulator.html#extended

基本上,单击模拟器控件中的三个点按钮(模拟器右侧),它将打开一个菜单,允许您控制模拟器,包括位置


当我加载多点 GPX/KML 时,设置窗口会永远旋转。 😔
C
Community

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-gps-emulator


第一个选项对我有用,只需稍作改动。我无法从 Eclipse 打开 DDMS 窗口,我只有一个空白的灰色页面。但是,当我运行模拟器时,如果我从命令提示符 (C:\Program Files\Android\android-sdk\tools\ddms) 打开 DDMS,那么我可以看到您在左侧使用设备和“模拟器控制”描述的窗口" 右侧的选项卡。谢谢!
S
Smile2Life

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

https://i.stack.imgur.com/hidEg.png


那么如何获得当前的纬度 lng 呢?
A
Asaf Pinhassi

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

adb emu geo fix [longtitude] [latitude]

V
Vasily Kabunov

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

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

在 Android 模拟器中启动您的应用程序并在您的 SDK 的 /tools 目录中打开一个终端/控制台。连接到模拟器控制台:telnet localhost 5555(用运行模拟器的任何端口替换 5555) 发送位置数据:* geo fix 发送固定的地理位置。此命令接受十进制度的经度和纬度,以及以米为单位的可选高度。例如:地理修复 -121.45356 46.51119 4392


T
Tim

很抱歉 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

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


u
user937284

我编写了一个 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()

奇迹般有效!感谢分享。
嗯。我认为有一个小错误:据我所知,地理修复消息按以下顺序获取经度和纬度:您以相反的方式发送它们。请参阅上面的答案。
不工作。模拟器正在监听端口,但它没有收到任何东西。
A
Alberto Gaona

在 Mac、Linux 或 Cygwin 中:

echo 'geo fix -99.133333 19.43333 2202' | nc localhost 5554

那会让你在墨西哥城。相应地更改您的经度/纬度/高度。如果您对 nmea 不感兴趣,这应该足够了。


您可能需要将 5554 调整为您当前的模拟器监听端口。
你是如何找到不同城市的价值的?我正在尝试从谷歌地图复制值,但它不在 90 到 - 90 的范围内。
b
boiledwater

https://i.stack.imgur.com/eKaH2.png


M
Milen

在通信端口被阻塞的 Linux 中。将终端导航到 android sdk 内的 platform-tools 文件夹并触发以下命令:

./adb -s #{device_name} emu geo fix #{longitude} #{latitude}

T
TryTryAgain

请参阅Obtaining User Location

Providing Mock Location Data 下查看。你会找到它的解决方案。


s
sachin pareek

首先在 Eclipse 中进入 DDMS 部分,然后打开模拟器控制 .... 转到手动部分设置纬度和经度,然后按发送按钮


J
James

我试图通过 adb 为许多点设置地理修复,但无法让我的应用程序查看任何 GPS 数据。但是当我尝试打开 DDMS,选择我的应用程序的进程并通过模拟器控制选项卡发送坐标时,它立即工作。


您不需要指定流程......或者 2010 年的 DDMS 可能需要这样做。
D
Dan

Dalvik 调试监视器 > 选择模拟器 > 模拟器控制选项卡 > 位置控制。

DDMS -- android_sdk/tools/ddms 或 android_sdk/tools/monitor


S
Swapnil

如果您使用的是 eclipse 然后使用模拟器控制器,您可以手动设置纬度和经度并在模拟器中运行基于地图的应用程序


e
electrobabe

如果您使用的是 Android Studio (1.3):

点击菜单“工具”

“安卓”

“安卓设备监视器”

点击你当前的模拟器

选项卡“模拟器控制”

转到“位置控制”并输入纬度和经度


K
Kyaw Tun

只需将 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 工作会更好。


非常有用的一个班轮!就我而言,我必须删除 \n: token=$(cat ~/.emulator_console_auth_token); 之间的空格。 cat <(echo -e "auth $token\ngeo fix 96.0290791 19.9041016\nexit") - |数控本地主机 5554
s
ssgao

如果上述解决方案不起作用。尝试这个:

在您的 android Manifest.xml 中,在应用程序标签之外添加以下两个链接,但当然是在您的清单标签内

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" ></uses-permission>
<uses-permission android:name="android.permission.INTERNET" ></uses-permission>

d
dvim

当模拟器在没有 Google API 的情况下运行 Android 图像时,我无法在模拟器上获得 GPS 修复。一旦我将图像更改为包含 Google API,这里提到的所有方法都可以使 GPS 修复工作。

确保在创建 AVD 时选择带有 Google API 的图像。


图像是什么意思,在创建 AVD 时,我将如何使用 Google API 选择图像?在 Eclipse 中创建 AVD 时没有这样的选项。
确保您已通过 Android SDK 管理器使用 Google API 下载图像。
M
Maik

已经多次提到的使用 shell 命令“geo fix ...”的答案是正确的答案。但是,如果您使用 LocationClient.getLastLocation() 来检索您的数据,那么值得一提的是,它一开始不会起作用。 LocationClient 类使用 Google Play 服务来检索坐标。对我来说,这在运行模拟器地图应用程序一次后开始工作。在第一次启动时,您被要求允许谷歌应用访问您的位置,我想这可以解决问题。


G
Gerhard Wesp

对于我自己的一个项目,我开发了一个在线服务,可以为 Android 模拟器提供模拟位置。

它使用 geo nmea 而不是 geo fix,它允许它设置速度、路线、精确时间等,除了纬度/经度。

该服务需要 nc (netcat) 命令行实用程序,仅此而已。

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


A
Ajeet Shah

您可以使用像 genymotion 这样的模拟器,它可以让您灵活地模拟您当前的 GPS 位置等。


@KansaiRobot 好吧,我确实需要在模拟器上安装 google play ( stackoverflow.com/questions/17831990/… )
J
Jesús Amieiro

Android Studio 有一个名为“Mock Location Plugin”的插件。您可以使用此插件模拟多个点。您可以在此链接中找到详细的使用手册:Android Studio. Simulate multiple GPS points with Mock Location Plugin


d
draekko

还不能发表评论,所以在这里更新@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