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

时间:2010-02-17 09:55:52

标签: android testing android-emulator geolocation

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

任何人都可以指导我如何实现这个目标吗?

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

34 个答案:

答案 0 :(得分:427)

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

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

telnet localhost 5554

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

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

geo fix <longitude value> <latitude value>

我发现此网站对于找到真实的lat / lng非常有用:http://itouchmap.com/latlong.html

如果你需要多个坐标,你可以使用带有路线的kml文件,这在article中有一点描述。我目前找不到更好的消息来源。

答案 1 :(得分:105)

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

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

android-gps-emulator

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

android-gps-emulator

答案 2 :(得分:80)

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

答案 3 :(得分:61)

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

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

emulator with menu button

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

enter image description here

Android Studio版本:2.3.3

此外,要使您的不同位置实时到您的应用程序,您可以使用GPX文件。从Google地图方向链接创建此文件非常容易:

  1. 转到Google地图,选择一个位置,然后按&#34;路线&#34;并进入第二个位置。
  2. 创建路线后,从浏览器复制链接
  3. 访问此网站:https://mapstogpx.com并将链接粘贴到&#34;让我们去看看&#34;框
  4. 按下&#34;让我们去看看&#34;按钮和GPX文件将被下载
  5. 使用&#34;加载GPS / KML&#34;按钮将创建的文件加载到模拟器,选择速度,然后按下底部的绿色播放按钮。地点将实时发送,如下图所示。

    enter image description here

答案 4 :(得分:32)

对于Android Studio用户:

运行模拟器,

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

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

答案 5 :(得分:13)

对于新的模拟器:

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

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

答案 6 :(得分:13)

<强> 1。 Android Studio用户。

运行模拟器后转到Tools-&gt; Android-&gt; Android设备监视器

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

<强> 2。 Eclipse用户。

首先在Eclipse中在菜单中选择“窗口”,然后选择“打开透视图”,然后选择“DDMS”。 即Window-&gt; Open Prespective-&gt; DDMS。

您将在左侧设备面板和右侧看到,您将看到不同的标签。 选择“仿真器控制”选项卡。

在底部,您将看到位置控制面板。 选择“手动”选项卡。

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

第3。使用telnet。

在运行命令中输入此内容。

telnet localhost 5554

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

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

geo fix long lat    
geo fix -121.45356 46.51119 4392

<强> 4。使用基于浏览器的Google地图工具

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

android-gps-emulator

答案 7 :(得分:13)

假设您已经设置并运行了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向模拟器发送模拟坐标,请转到“窗口”菜单,选择“显示视图”&gt; “其他”&gt; “模拟器控制”,您可以从出现的模拟器控制面板发送坐标。

答案 8 :(得分:10)

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

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

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

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

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

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

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

    geo fix -121.45356 46.51119 4392
    

答案 9 :(得分: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()

答案 10 :(得分:5)

在Mac,Linux或Cygwin中:

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

那将把你带到墨西哥城。相应地更改您的经度/纬度/高度。如果你对nmea不感兴趣,那就足够了。

答案 11 :(得分:5)

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

答案 12 :(得分:5)

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

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

答案 13 :(得分:4)

请参阅Obtaining User Location

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

答案 14 :(得分:4)

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

adb emu geo fix [longtitude] [latitude]

答案 15 :(得分:4)

首先进入日食中的DDMS部分 比开放模拟器控制....                              转到手动部分                                            设置lat和long,然后按发送按钮

答案 16 :(得分:3)

Dalvik Debug Monitor&gt;选择模拟器&gt; <仿真器控制选项卡>位置控制。

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

答案 17 :(得分:3)

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

答案 18 :(得分:2)

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

答案 19 :(得分:2)

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

  • 点击菜单“工具”
  • “机器人”
  • “Android设备监视器”
  • 点击您当前的模拟器
  • 选项卡“模拟器控制”
  • 转到“位置控制”并输入Lat and Lon

答案 20 :(得分:2)

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

答案 21 :(得分:1)

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

答案 22 :(得分:1)

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

它使用geo nmea而不是geo fix,除了lat / lon之外,还可以设置速度,航向,精确时间等。

该服务需要nc(netcat)命令行实用程序,而不需要其他任何内容。

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

答案 23 :(得分:1)

当模拟器在没有Google API的情况下运行Android图像时,我无法在模拟器上获得GPS修复。只要我将图像更改为包含Google API,就会提到所有这里提到的GPS修复方法。

确保在创建AVD时选择使用Google API的图片。

答案 24 :(得分:1)

您可以使用genymotion之类的模拟器,让您可以灵活地模拟当前的GPS位置等。

答案 25 :(得分:1)

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

答案 26 :(得分:1)

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

在Android Manifest.xml中,添加应用程序标记的以下两个链接 OUTSIDE ,但当然在您的清单标记内

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

答案 27 :(得分:1)

最后,使用最新版本的Android Studio 4和他的新仿真器更新10/23/2019,变得更加容易。 启动仿真器并转到仿真器参数...>在“路线”选项卡中,您可以在地图上从/到两个点选择一条新路线,并以可调的播放速度开始一条新路线,该速度可以超过1000 km / h!

enter image description here

答案 28 :(得分:1)

打开Android工作室 - &gt;工具菜单 - &gt; Android-&gt; Android设备监视器 - >模拟器选项卡 - &gt;位置控制 - &gt;设置所需的纬度和经度,并根据需要检查项目

答案 29 :(得分:0)

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

location

最后点击 SET LOCATION 按钮保存。

答案 30 :(得分:0)

我在Android Studio 3.5.1上遇到了同样的问题 当我单击Android模拟器右侧的三个点并选择“位置”标签时,我看不到发送选项。我试图设置一个位置点,但这并没有更改我的默认cupertino位置。 打开Goog​​le地图,它将自动为您定位,您的Cupertino位置也会更改。

答案 31 :(得分: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

答案 32 :(得分:0)

尚未发表评论,所以更新@ectomorphs会在这里回答,现在telneting需要有一个身份验证令牌。在/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脚本可以像这样设置coorinate

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

答案 33 :(得分:0)

在日食中:

您可能需要向下拖动DDMS窗口。 &#39;位置控制&#39;位于&#39; Telephony Actions&#39;并且可能被正常大小的控制台视图隐藏(带控制台的栏,LogCat等可能会覆盖它!)