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

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

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


假设你已经设置并运行了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>

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

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


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


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

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

android-gps-emulator

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


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

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

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


如果您正在使用Eclipse,请转到窗口->打开透视图->DDMS,然后在位置控制中键入1并单击发送。


请参见获取用户位置

请参阅提供模拟位置数据。你会找到解决方法的。


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

在你的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菜单中选择“窗口”,然后选择“打开透视图”,然后选择“DDMS”。 即窗口->打开透视->DDMS。

你会看到左边设备面板和右边你会看到不同的选项卡。 选择“模拟器控制”选项卡。

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

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

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。


The already mentioned multiple times answer to use the shell command "geo fix..." is the correct answer. But in case you use LocationClient.getLastLocation() to retrieve your data it is worth to mention that it will not work at first. The LocationClient class uses the Google Play Service to retrieve the coordinates. For me this started working after running the emulators maps app once. During the first start you are asked to allow google apps access to your location, which I guess does the trick.


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

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

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


在eclipse中:

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

~


对于Android Studio用户:

运行模拟器,

然后进入“工具->Android ->Android设备监视器”

打开模拟器控件选项卡,并使用位置控件组。


在我自己的一个项目中,我开发了一个在线服务,可以为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 Studio。用模拟位置插件模拟多个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设备中显示的模拟器端口号。

如果亚行的emu能够发挥作用,情况会更好。


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

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

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

Android Studio版本:2.3.3

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

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

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


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


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


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


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


在模拟中选择扩展控件。之后,您可以通过搜索或拖动映射到要设置的位置来设置模拟的位置。

最后点击SET LOCATION按钮保存。


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

1)进入位置设置:

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

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

4)点击该位置图标 您的位置现在应该在您的设备上更新。 你可以再次用谷歌搜索“我的当前位置”来验证。

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


对于BlueStack用户:打开模拟器,按Ctrl+Shift +K,然后找到你的位置,并按下设置位置!