关于测试:如何在Android模拟器中模拟GPS位置?

How to emulate GPS location in the Android Emulator?

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

有人能指导我如何做到这一点吗?

如何将仿真器的位置设置为测试位置?


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

这里详细介绍了如何使用控制台。要连接到控制台,请打开命令行并键入

1
telnet localhost 5554

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

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

1
geo fix <longitude value> <latitude value>

我发现这个网站有助于找到一个现实的lat/lng:http://itouchmap.com/latlong.html

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


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

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

Android GPS模拟器

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

android-gps-emulator


如果你用的是Eclipse,去Window->Open Perspective->DDMS,然后在Location Controls中输入一个,然后点击Send


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

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

emulator with menu button

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

enter image description here

Android Studio版本:2.3.3


对于Android Studio用户:

运行模拟器,

然后,去Tools -> Android ->Android device monitor

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


对于新仿真器:

http://developer.android.com/tools/devices/emulator.html扩展

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


假设您已经设置并运行了一个mapview:

1
2
3
4
5
6
7
8
9
10
11
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();
    }
});

您需要在您的清单中获得以下权限:

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

要从Eclipse向Emulator发送模拟坐标,请转到"窗口"菜单,选择"显示视图">"其他">"Emulator控件",然后可以从出现的Emulator控件窗格发送坐标。


1。Android Studio用户。

运行Emulator Goto Tools->Android->Android设备监视器后

从"位置控制"组中单击"Emulator控制"选项卡"更改"。

2。Eclipse用户。

首先在Eclipse菜单中选择"窗口",然后选择"打开透视图",然后选择"DDMS"。即window->open prescieve->ddms。

您将在左侧设备面板和右侧看到不同的选项卡。选择"Emulator Control"选项卡。

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

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

三。使用telnet。

在运行命令中键入此。

1
telnet localhost 5554

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

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

1
2
geo fix long lat    
geo fix -121.45356 46.51119 4392

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

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

Android GPS模拟器


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

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

  • 在android模拟器中启动应用程序,并在sdk的/tools目录中打开终端/控制台。

  • 连接到仿真器控制台:

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

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

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

    1
    geo fix -121.45356 46.51119 4392

  • 我编写了一个python脚本,通过telnet将GPS位置推送到模拟器上。它定义了源和目标位置。还有一个时间偏移,可以控制将坐标推送到设备上的时间。一个位置每秒被推一次。

    在下面的例子中,脚本在120秒内从柏林移动到汉堡。每秒一步/GPS定位,随机距离。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    #!/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}
    ".format(LNG_SRC, LAT_SRC))
    #tn.write("exit
    ")

    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}
    ".format(lng, lat))
        #tn.write("exit
    ")
        sleep(1)

    tn.write("geo fix {0} {1}
    ".format(LNG_DST, LAT_DST))
    tn.write("exit
    ")

    print tn.read_all()


    我使用Eclipse Plug DDMS功能发送GPS。enter image description here


    在Mac、Linux或Cygwin中:

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

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


    在Linux中,通信端口被阻塞。将终端导航到android sdk中的平台工具文件夹,并启动此命令:

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

    以下解决方案适用于我-打开命令行并写入:

    1
    adb emu geo fix [longtitude] [latitude]


    在Eclipse中首先进入DDMS部分比打开仿真器控件…。转到手动部分设置lat和long,然后按发送按钮


    请参见获取用户位置

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


    Dalvik Debug Monitor>选择Emulator>Emulator Control选项卡>位置控件。

    ddms——android_sdk/tools/ddms或android_sdk/tools/monitor


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


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


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

    • 点击"工具"菜单
    • "Android"
    • "Android设备监视器"
    • 单击当前模拟器
    • 选项卡"Emulator控件"
    • 转到"位置控制"并输入lat和lon

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

    1
    2
    3
    token=$(cat ~/.emulator_console_auth_token); cat <(echo -e"auth $token
      geo fix 96.0290791 16.9041016  
     exit") - | nc localhost 5554

    5554是adb devices中显示的仿真器端口号。

    如果adb emu工作的话,情况会更好。


    已经提到多次使用shell命令"geo fix…"的答案是正确的。但是,如果您使用locationclient.getLastLocation()来检索您的数据,那么首先值得注意的是,它将不起作用。locationClient类使用Google Play服务来检索坐标。对我来说,这在运行一次EmulatorsMaps应用程序之后就开始工作了。在第一次启动时,你被要求允许谷歌应用程序访问你的位置,我想这是个技巧。


    ></P><P>打开android studio->tools menu->android->android device monitor->emulator tab->location control->set your required latitude and longitude并根据需要检查项目</P></p>
<div class=


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

    它使用geo-nmea而不是geo-fix,这样除了lat/lon之外,还可以设置速度、路线、精确时间等。

    该服务需要NC(netcat)命令行实用程序,而不需要其他任何工具。

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


    当Emulator在运行没有Google API的Android映像时,我无法在Emulator上获得GPS定位。当我把图片改成包含google apis时,这里提到的所有让GPS修复工作正常的方法。

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


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

    在android manifest.xml中,在application标记外添加以下两个链接,当然,在manifest标记内添加

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

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


    Android Studio有一个插件叫做"模拟位置插件"。你可以用这个插件模拟多个点。您可以在以下链接中找到详细的使用手册:android studio。用模拟定位插件模拟多个GPS点


    还不能评论,所以在这里更新@ectomorphs答案,当telneting现在需要一个auth令牌。在Linux中,它位于/home/username/下。emulator_console_auth_token

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    #!/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}
    ".format(AUTH_TOKEN))
    tn.read_until("OK", 5)

    tn.read_until("OK", 5)

    tn.write("geo fix {0} {1}
    ".format(LNG_SRC, LAT_SRC))
    #tn.write("exit
    ")

    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}
    ".format(lng, lat))
        #tn.write("exit
    ")
        sleep(1)

    tn.write("geo fix {0} {1}
    ".format(LNG_DST, LAT_DST))
    tn.write("exit
    ")

    print tn.read_all()

    从shell脚本可以这样设置coordinate

    1
    2
    3
    4
    5
    #!/usr/bin/env bash
    export ATOKEN=`cat ~/.emulator_console_auth_token`
    echo -ne"auth $ATOKEN
    geo fix -99.133333 19.43333 2202
    "  | nc localhost 5554

    我做了一个类似于前面答案之一的小脚本,但是使用expect而不是python,因为它比较简单(expect就是为此而发明的)。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #!/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
    "
    }

    send"geo fix $lon $lat
    "
    expect OK
    send"exit
    "

    示例用法:sendloc 5554 2.35607 48.8263


    在Eclipse中:

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

    ~