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

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

有谁能指导我如何实现这个目标吗?

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

497861 次浏览

假设你已经设置并运行了mapview:

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

您可以通过Telnet连接到模拟器。然后你有一个模拟器控制台,允许你输入特定的数据,如地理定位,网络等。

如何使用控制台被广泛地解释在这里。 要连接到控制台,打开命令行并键入

telnet localhost 5554

然后,您可以使用geo命令在设备上设置纬度、经度以及(如果需要的话)海拔高度,该设备将通过gps位置提供程序传递给所有程序。请参阅上面的链接以获得进一步的说明。

要在控制台中运行的特定命令为

geo fix <longitude value> <latitude value>

我发现这个网站有助于找到一个现实的纬度/液化天然气:http://itouchmap.com/latlong.html

如果你需要一个以上的坐标,你也可以使用一个kml文件和一个路由,它在文章中有一点描述。我现在找不到更好的消息来源了。

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

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

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

android-gps-emulator

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

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

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

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

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

    telnet localhost 5555(将5555替换为模拟器正在运行的任何端口)

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

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

    geo fix -121.45356 46.51119 4392
    

如果你正在使用Eclipse,转到Window->Open Perspective->DDMS,然后在Location Controls中键入1并点击Send

看到获取用户位置信息

提供模拟位置数据下查找。你会找到解决方法的。

如果上述解决方案不奏效。试试这个:

在你的android manifest .xml中,添加以下两个链接的应用程序标签,当然是在你的manifest标签中

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

当模拟器在没有谷歌api的情况下运行Android图像时,我无法在模拟器上获得GPS定位。只要我改变图像包含谷歌api,这里提到的所有方法得到GPS固定工作。

在创建AVD时,请确保选择带有谷歌api的图像。

1. Android Studio用户。

运行模拟器后,进入Tools->Android->Android设备监视器

从位置控件组中单击“模拟器控件”选项卡更改。

2. Eclipse用户。

在Eclipse的菜单中选择“window”;然后选择“Open perspective”;然后选择“DDMS" 即窗口->开放透视->DDMS.

您将在左侧设备面板和右侧看到不同的选项卡。 选择“模拟器控制”;选项卡。< / p > 在底部你会看到位置控制面板。 选择“Manual"选项卡。< / p >

在文本框中输入经度和纬度,然后单击发送按钮。 它将把位置发送给你的模拟器和应用程序

3.使用telnet。

在run命令中键入this。

telnet localhost 5554

如果您不使用windows,您可以使用任何telnet客户端。

连接到telnet后,使用以下命令将您的位置发送到模拟器。

geo fix long lat
geo fix -121.45356 46.51119 4392

4. 使用基于浏览器的谷歌地图工具

有一个程序使用GWT和谷歌Maps API来启动一个基于浏览器的地图工具来设置模拟器中的GPS位置:

android-gps-emulator

Dalvik Debug Monitor >选择模拟器>模拟器控制选项卡>位置控制。

DDMS——android_sdk/tools/ DDMS或android_sdk/tools/monitor

首先进入eclipse中的DDMS部分 比打开模拟器控件.... 转到手动部分 设置纬度和长度,然后按发送按钮

我使用eclipse插件DDMS功能发送GPS。 enter image description here

前面提到的多次使用shell命令的答案“geo修复……”是正确答案。 但如果你使用LocationClient.getLastLocation ()来检索你的数据,值得一提的是,它在一开始不会工作。LocationClient类使用谷歌Play Service来检索坐标。 对我来说,这开始工作后运行模拟器地图应用程序一次。在第一次启动时,你会被要求允许谷歌个应用程序访问你的位置,我想这是可行的

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

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

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

在eclipse中:

您可能需要向下拖动DDMS窗口。 “Location Controls”位于“Telephony Actions”下,可能被一个正常大小的控制台视图隐藏(带有控制台,LogCat等的栏可能会覆盖它!)

对于Android Studio用户:

运行模拟器,

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

打开Emulator Control选项卡,并使用位置控件组。

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

它使用geo nmea而不是geo fix,这使得它可以设置速度,航线,精确的时间等,除了纬度/长度。

该服务只需要nc (netcat)命令行工具,不需要其他工具。

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

在Mac、Linux或Cygwin系统下:

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

这样你就能到墨西哥城了。相应地改变你的经度/纬度/高度。如果你对nmea不感兴趣,这应该足够了。

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

如果你使用Android Studio (1.3):

  • 点击菜单“工具”
  • “Android”
  • “Android设备监视器”
  • 单击当前模拟器
  • 选项卡“模拟器控制”
  • 进入“位置控制”,输入纬度和高度

对于新的模拟器:

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

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

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

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

还不能评论,所以更新@ectomorphs回答在这里,当telneting现在需要一个认证令牌。在linux中,它在/home/username/.emulator_console_auth_token下

#!/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

下面的解决方案对我有用——打开命令行,然后写:

adb emu geo fix [longtitude] [latitude]

把阿尔贝托·高纳的回答写在一行里

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模拟器,点击菜单按钮(3点)如下所示:

模拟器与菜单按钮

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

enter image description here

Android Studio版本:2.3.3

此外,为了使不同的位置实时到达应用程序,可以使用GPX文件。从谷歌地图方向创建这个文件非常简单:

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

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

enter image description here

我已经做了一个小脚本类似于前面的答案之一,但使用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

 ></a></p>


<p>打开Android studio->工具菜单->Android-> Android设备监视器->模拟器选项卡->位置控制->设置所需的纬度和经度,并根据需要检查项目</p></div>
                                                                            </div>
                                </div>
                            </div>
                        </div>
                                                <div class=

最后,随着最新发布的Android Studio 4和他的新模拟器更新2019年10月23日,它变得更容易了。 启动模拟器,进入模拟器参数…>在“路线”选项卡,你可以选择地图上的两个点,从/到,开始一个新的路线,播放速度可调,可以达到1000公里/小时以上!< / p >

enter image description here

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

在模拟器中进入Extended controls。之后,您可以通过搜索或拖动映射到要设置的位置来设置模拟的位置。

location

最后点击SET LOCATION按钮保存。

对不起,在这个问题上的一些建议之后,我把我的位置设置为阿拉斯加。然而,我的设备仍然显示在加州山景城(谷歌的总部?)下面是我的修复方法:

1)进入位置设置:

enter image description here

2)设置测试地点。我选择了阿拉斯加。

enter image description here

3)谷歌“我现在的位置”;然后点击图中圈出来的地图。 请注意,即使我将位置设置为阿拉斯加,我的虚拟设备仍然认为它在加州山景城

enter image description here

4)点击这个位置图标 您的位置现在应该在您的设备上更新。 你可以通过谷歌搜索“我的当前位置”来验证。一次。< / p >

enter image description here

如果有人遇到同样的问题,我希望我的解决方案能帮助到你。