488

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

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

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

4

35 回答 35

458

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

此处详细说明了如何使用控制台。要连接到控制台,请打开命令行并键入

telnet localhost 5554

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

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

geo fix <longitude value> <latitude value>

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

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

于 2010-02-17T10:24:36.137 回答
195

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

首先,运行您的 Android 模拟器并单击如下所示的菜单按钮(3 个点):

带菜单按钮的模拟器

然后从左侧窗格中,选择位置并根据需要更改坐标。按下发送按钮后,更改将立即生效(我建议您打开谷歌地图以便更好地理解)。

在此处输入图像描述

安卓工作室版本:2.3.3

此外,为了使您的不同位置实时进入您的应用程序,您可以使用 GPX 文件。从谷歌地图方向链接创建这个文件非常容易:

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

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

在此处输入图像描述

于 2017-07-14T09:00:38.667 回答
117

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

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

安卓-gps-模拟器

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

于 2010-10-15T01:04:30.383 回答
81

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

于 2012-01-23T03:15:33.177 回答
33

对于 Android Studio 用户:

运行模拟器,

然后,前往Tools -> Android ->Android device monitor

打开Emulator Control选项卡,然后使用位置控制组。

于 2015-02-23T18:26:07.657 回答
14

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

安卓-gps-模拟器

于 2012-11-06T10:43:05.343 回答
14

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

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

于 2010-02-17T10:01:22.240 回答
14

对于新的模拟器:

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

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

于 2016-05-02T10:30:14.720 回答
13

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

在此处输入图像描述

于 2019-10-27T19:50:19.913 回答
10

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

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

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

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

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

  3. 发送位置数据: * geo fix 发送一个固定的地理位置。

    此命令接受十进制度的经度和纬度,以及以米为单位的可选高度。例如:

    geo fix -121.45356 46.51119 4392
    
于 2011-04-12T07:58:57.183 回答
10

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

adb emu geo fix [longtitude] [latitude]
于 2016-10-26T05:20:05.437 回答
8

我编写了一个 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()
于 2015-07-15T14:12:48.783 回答
6

在 Mac、Linux 或 Cygwin 中:

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

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

于 2015-06-03T20:57:49.737 回答
5

在通信端口被阻塞的 Linux 中。将终端导航到其中的平台工具文件夹android sdk并触发以下命令:

./adb -s #{device_name} emu geo fix #{longitude} #{latitude}
于 2013-12-17T08:07:57.267 回答
5

我使用eclipse插件DDMS功能发送GPS。 在此处输入图像描述

于 2013-06-17T09:39:29.417 回答
4

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

于 2012-12-13T07:00:45.060 回答
4

请参阅获取用户位置

查看提供模拟位置数据。你会找到它的解决方案。

于 2012-03-15T20:46:09.423 回答
3

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

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

于 2012-12-11T18:13:43.900 回答
3

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

于 2010-08-08T12:38:10.030 回答
2

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

于 2014-01-27T16:44:27.677 回答
2

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

于 2017-01-26T04:06:22.273 回答
2

很抱歉 NecroPost,但在遵循有关此问题的一些建议后,我将我的位置设置为阿拉斯加。但是,我的设备仍显示在加利福尼亚山景城(谷歌总部?)。因此,这是我进行修复的方法:

1)进入位置设置:

在此处输入图像描述

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

在此处输入图像描述

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

在此处输入图像描述

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

在此处输入图像描述

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

于 2021-11-24T17:44:42.727 回答
2

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

  • 点击菜单“工具”
  • “安卓”
  • “安卓设备监视器”
  • 点击你当前的模拟器
  • 选项卡“模拟器控制”
  • 转到“位置控制”并输入纬度和经度
于 2015-08-06T12:47:54.917 回答
1

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

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

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

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

于 2015-03-01T23:08:38.493 回答
1

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

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

于 2012-10-17T05:10:37.510 回答
1

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

于 2013-10-24T07:25:21.270 回答
1

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

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

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" ></uses-permission>
<uses-permission android:name="android.permission.INTERNET" ></uses-permission>
于 2012-10-08T04:03:05.803 回答
1

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

于 2016-06-06T11:43:00.737 回答
1

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

于 2016-07-18T07:28:42.733 回答
1

打开Android studio->Tools menu->Android->Android Device Monitor->Emulator Tab->Location control->设置你需要的经纬度,根据需要检查你的项目

于 2017-11-07T10:33:50.507 回答
1

还不能发表评论,所以在这里更新@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
于 2016-10-11T14:06:50.057 回答
1

Extended controls模拟。然后,您可以通过搜索或将地图拖动到要设置的位置来设置仿真的位置。

地点

最后点击SET LOCATION按钮保存。

于 2021-06-07T11:31:05.870 回答
0

在日食中:

您可能必须向下拖动 DDMS 窗口。“位置控制”位于“电话操作”下,可能会被正常大小的控制台视图隐藏(带有控制台、LogCat 等的栏可能会覆盖它!)

~

于 2015-01-06T08:35:18.377 回答
0

我制作了一个类似于先前答案之一的小脚本,但使用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

于 2017-08-21T13:27:30.037 回答
0

我在 Android Studio 3.5.1 上遇到了同样的问题,当我单击 android 模拟器右侧的三个点并选择位置选项卡时,我没有看到发送选项。我试图设置一个位置点,但这并没有改变我的默认库比蒂诺位置。打开谷歌地图,它会自动定位你,你的库比蒂诺位置会改变。

于 2019-11-10T17:51:49.407 回答