2010-02-17 148 views
381

我想获得Android模拟器的经度和纬度进行测试。如何在Android模拟器中模拟GPS位置?

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

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

+0

如果您使用Genymotion:http://stackoverflow.com/questions/30709329/give-fake-location-to-genymotion-emulator – 2016-09-09 20:22:14

+0

您可以安装其中一个模拟位置应用程序s在Play商店。 – whoKnows 2017-11-01 20:37:50

回答

410

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

如何使用控制台广泛解释here。 要连接到控制台打开命令行,然后键入

telnet localhost 5554 

然后,您可以使用地理命令设置纬度,经度和必要时的高度是使用GPS的位置信息提供传递给所有的程序在设备上。有关详细说明,请参阅上面的链接。

的具体命令控制台运行是

geo fix <longitude value> <latitude value> 

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

如果您需要更多然后一个坐标,你可以使用KML文件与路线以及这是article一点点描述。目前我找不到更好的来源。

+12

使用地理定位我还设置模拟经纬度仍然得到空位置。 – UMAR 2010-02-17 11:03:30

+0

现在通过telnet添加很多值现在它工作..我不知道为什么输入两个或三个值它不工作.. 它的工作直到我关闭模拟器,当我关闭模拟器我不得不再次输入模拟值。 – UMAR 2010-02-17 11:53:18

+1

或简单的方法打开仿真器中的gps,并转到仿真器控制给虚拟纬度,长值,并发送你将在仿真器中获得这些值作为gps位置。 – UMAR 2011-05-23 11:10:50

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,转到“窗口”菜单,选择“显示视图”>“其他”>“仿真器控制”,并且可以从出现的仿真器控制面板发送坐标。

+3

但我的朋友在哪里经度和纬度? – UMAR 2010-02-17 10:06:30

+1

我已经尝试过使用此ans向仿真器控件发送模拟值,但是当我按下发送按钮时,它不会执行任何操作,不会显示任何消息确认已发送或未发送的值。 seocnd的东西GeoPoint g = myLocation.getMyLocation(); 正在返回空值。 – UMAR 2010-02-17 10:19:15

+0

你确定你在'runOnFirstFix'中使用它吗?因为这是设备第一次接收GPS位置时引发的事件,所以如果这种情况发生,getMyLocation应该肯定会返回一个值。 – 2010-02-17 10:25:43

3

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

+0

你不需要指定一个过程...或者,也许在2010年的DDMS需要这样做。 – 2012-02-13 22:03:30

100

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

无法找到任何东西,我放在一起使用GWT和谷歌地图API推出一个基于浏览器的地图工具来设置在模拟器中的GPS定位了一个小程序:

android-gps-emulator

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

android-gps-emulator

+1

杰出的工具!非常感谢! – 2012-07-18 23:43:14

+0

真的很棒,谢谢! :) – 2013-04-30 18:29:25

+0

哇,谢谢!安装程序工作得很好,但我无法管理到模拟器的连接 - > log打印java.net.ConnectionRefused。然后我尝试了telnet localhost 5554(从终端),它的工作..有其他人在mac上成功地测试了你的模拟器? – ottel142 2013-09-12 09:54:36

10

在模拟器控制台使用“地理”命令

要通过命令行发送模拟位置数据:

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

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

    telnet localhost 5555

  3. 发送的位置数据(与任何与您的模拟器上运行更换5555): *地理修复发送一个固定的地理位置。

    这个命令接受以十进制度的经度和纬度,以及在米任选高度。例如:

    geo fix -121.45356 46.51119 4392 
    
80

如果您使用Eclipse,去Window->Open Perspective->DDMS,然后键入一个在Location Controls和命中Send

+8

这是迄今为止我见过的最简单的方法。确保你设置了你的AVD和GPS支持,然后在DDMS透视点击设备下运行的模拟器,选择中间 - 右侧窗格中的模拟器控制选项卡,然后在底部显示SteveCav提到的位置控制部分(使用Eclipse Juno 4.2 for Java开发人员使用最新的ADT)。我的位置控件面板甚至预装了位置数据。 – 2012-11-17 21:03:19

+0

伟大的答案!与任何IDE工作,因为ddms是sdk的一部分(yoursdkfolder/tools /) – Zarokka 2013-12-05 13:52:16

+1

这个,也不是telnet上面的解释,为我工作。我试图让我的位置像这样,但它仍然是空的。 'LocationManager mlocManager =(LocationManager)getSystemService(Context.LOCATION_SERVICE);' 'Location location = mlocManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);' – crowmagnumb 2014-07-31 18:13:45

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> 
1

我无法获得GPS定位上模拟器在没有Google API的情况下运行Android图像时的模拟器。只要我将图片更改为包含Google API,就可以使用这里提到的所有方法来获取GPS修正。

确保您在创建AVD时使用Google API选择图像。

+0

你是什么意思的图像,同时创建AVD我怎么会选择一个图像与谷歌API?在eclipse中创建AVD时没有这样的选项。 – user1911703 2015-07-28 03:09:07

+0

确保您已经通过Android SDK管理器下载了带有Google API的图像。 – dvim 2015-07-28 06:57:09

12

1. Android Studio用户。

运行仿真器转到工具 - > Android-> Android装置监视器

点击从位置控制组模拟器控制选项卡改变之后。

2. Eclipse用户。

首先在Eclipse在菜单中选择“窗口”,然后选择“打开透视图”,然后选择“DDMS”。例如Window-> Open-Pro-> DDMS。

在左边设备小组和右边你会看到不同的选项卡,您将看到。 选择“Emulator Control”选项卡。

底部你会看到位置控制面板。 选择“手动”选项卡。

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

3.使用telnet。

在运行命令中输入this。

telnet localhost 5554 

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

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

geo fix long lat  
geo fix -121.45356 46.51119 4392 

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

存在使用GWT和谷歌地图API推出一个基于浏览器的地图工具来设置在模拟器中的GPS定位程序:

android-gps-emulator

+0

这个第一个选项适用于我,只需要一点小改动。我无法从Eclipse打开DDMS窗口,只是空白的灰色页面。但是,当我运行模拟器时,如果我从命令提示符(C:\ Program Files \ Android \ android-sdk \ tools \ ddms)打开DDMS,那么我可以看到左边的设备描述的窗口和“Emulator Control “右边的标签。谢谢! – 2013-11-12 02:34:07

3

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

DDMS - android_sdk /工具/ DDMS或android_sdk /工具/监控

4

首先去DDMS节在Eclipse 比开放模拟器控制.... 去往组lat和长手册第 和然后按发送按钮

5

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

0

已经提到多次回答使用shell命令“地理修复...”是正确答案。 但是,如果您使用LocationClient.getLastLocation()来检索您的数据,值得一提的是它不会在第一时间工作。 LocationClient类使用Google Play服务来检索坐标。 对我来说,这个在开始运行仿真器映射应用程序后开始工作。在第一次启动时,您被要求允许谷歌应用程序访问您的位置,我猜这是诀窍。

5

在通信端口被阻塞的Linux中。导航终端平台的工具文件夹内android sdk和火命令:如果你使用eclipse然后使用模拟器控制器,你可以手动设置纬度和经度和运行仿真器中的基于地图的应用

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

在eclipse中:

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

+0

我在模拟器控制下找到了DDMS。位置控件下面的标签。 – user914425 2015-08-11 00:55:35

29

对于Android的Studio用户:

运行模拟器,

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

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

+0

在我的情况下,所有的文件都是不可编辑的。你有好主意吗 ? – 2016-10-05 06:49:47

+3

@MustafaOlkun这可能意味着模拟器本身具有这些控件。在模拟器旁边寻找“...”。 – Justin 2016-11-01 23:53:08

+1

我有同样的问题。它们不可编辑。是的,有“......”。但是,当我在那里放置任何东西并发送时,应用程序中没有任何更改... – KansaiRobot 2017-02-01 13:44:20

1

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

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

该服务需要nc(netcat)命令行工具,而不是其他任何东西。

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

5

在Mac,Linux或Cygwin的:

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

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

+0

您可能必须将5554调整为您当前的仿真器侦听端口。 – 2015-06-03 21:00:00

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() 
+0

工程就像一个魅力!感谢分享。 – 2015-08-20 21:06:58

+0

@AlbertoGaona很高兴为你效劳! – user937284 2015-08-20 21:17:43

+0

嗯。我认为有一个小小的错误:据我所知,地理修复信息获取经度和纬度,顺序是:您以相反的方式发送它们。见上面的答案。 – 2015-08-20 21:29:06

2

如果你使用的是Android工作室(1.3):

  • 点击菜单 “工具”
  • “Android” 的
  • “Android设备监视器”
  • 点击您的当前仿真器
  • 选项卡“仿真器控制”
  • 转到“位置控制”和输入纬度和经度
1

您可以使用仿真器,如genymotion,它可以灵活地模拟您当前的GPS位置等。

+0

是的,Genymotion运作良好。我无法安装Android地图,但... – KansaiRobot 2017-02-01 13:47:34

+0

@KansaiRobot嗯,我确实需要安装谷歌播放(http://stackoverflow.com/questions/17831990/how-do-you-install-google-frameworks-play -accounts-etc-on-a-genymotion-virt)仿真器 – 2017-02-03 10:14:43

0

还不能评论,所以更新@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脚本可以设置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 
3

以下解决方案为我 - 开放的命令行写:

adb emu geo fix [longtitude] [latitude] 
2

只是要阿尔贝托·高纳的回答为一行

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有效,情况会更好。

+0

非常有用的一个班轮!在我的情况下,我不得不删除\ n之间的空格: token = $(cat〜/ .emulator_console_auth_token); cat <(echo -e“auth $ token \ ngeo fix 96.0290791 19.9041016 \ nexit”) - | nc localhost 5554 – Jeremie 2017-03-23 14:36:29

15

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

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

emulator with menu button

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

enter image description here

的Android Studio版本:2.3.3

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

1

打开Android工作室 - >工具菜单 - > Android-> Android设备监视器 - >仿真器标签 - >位置控制 - >设置所需的纬度和经度和检查您的项目根据您的需要

+0

你可以设置静态位置值(经度和纬度)你需要直接在编码部分检查哪个位置? – 2017-12-11 08:00:07