2016-06-07 75 views
1

我有一个x86 API23 AVD(带有Google API),它使用Android Studio 2.1.1创建,我需要发送GPS坐标。我已经广泛阅读了如何使用命令行中的“adb emu geo fix”命令或通过telnet--在验证后执行此操作,然后发送geo fix命令以及命令的纬度,经度和可选高度参数线也是如此。如何以编程方式将GPS位置发送到Android Studio 2.0 AVD

我在Mac OSX El Capitan盒子上运行我的代码。

问题是我的应用程序 - 需要输入我发送的GPS坐标的应用程序,就好像它没有获取任何数据。

如果我使用AVD本身的扩展控件来发送与SEND按钮相同的当前位置,或播放从.gpx文件加载的路由数据,那么一切正常。该应用获取GPS数据并按照预期行事。

问题是,我正在运行需要启动AVD的测试自动化(Appium,Java,TestNG),然后发送GPS数据,然后验证被测试的应用的行为与预期的一致GPS数据。

这意味着我无法手动与AVD的扩展手动控制进行交互。

我必须以编程方式完成这一切。

以下是我现在通过Telnet命令进行的操作。代码看起来基本上像这样发送只是一个“当前位置”:

import org.apache.commons.net.telnet.TelnetClient; 

static TelnetClient tc = null; 

    public InputStream inptStream; 
    public PrintStream outptStream; 
    public String prompt = "OK"; 

//Instantiate the telnet client -- we use this to send geo fix commands to the emulator 
      tc = new TelnetClient(); 

//Connect, this will generate the auth_token if it does not already exist in file system 
       System.out.println("Trying to connect to AVD..."); 
       tc.connect("localhost", 5554); 

//Check to see if we are connected 
       Boolean areWeConn = tc.isConnected(); 
       System.out.println("Are we connected?" + areWeConn); 

// Get input and output stream references 
       System.out.println("Getting input and output streams..."); 
       inptStream = tc.getInputStream(); 
       outptStream = new PrintStream(tc.getOutputStream()); 

       //wait for OK prompt 
       System.out.println("Waiting for the OK prompt..."); 
       //Not including readUntil() code because it's just reading terminal output 
       readUntil(prompt); 

       //Send the auth token number 
       System.out.println("Sending auth token..."); 
       outptStream.println("auth " + "3A/Yfazi3pRcvNiB"); 
       outptStream.flush(); 

       //wait for OK prompt 
       System.out.println("Waiting for the OK prompt..."); 
       readUntil(prompt); 

       //Send current location for our Starting Point 
       System.out.println("Sending Current Location - Starting Point"); 
       outptStream.println("geo" + "fix" + "28.4194 -81.5812"); 
       outptStream.flush(); 

//Now disconnect from Telnet 
       System.out.println("Disconnecting from AVD..."); 
       tc.disconnect(); 

//Check to see if we are still connected 
       Boolean stillConn = tc.isConnected(); 
       System.out.println("Are we still connected? " + stillConn); 

当上面的代码未能触发我的应用程序的预期行为,即使它出现在所有没有任何错误的工作,我用与在其上运行我的应用程序,然后启动AVD的终端使用的另一个终端发送的“当前位置”手动在Telnet行提示下列命令(认证后):

telnet localhost 5554 

等待行...

然后验证通过发送身份验证令牌...

等待OK手动,则发送:

geo fix "28.4194 -81.5812" 

这个命令出现在提示符下(没有错误)完美地工作,但我的应用程序显然没有得到任何GPS信息。

所以,我尝试使用上述命令的ADB版本,就像这样:

adb emu geo fix "28.4194 -81.5812" 

但这也未能奏效。

同样,使用Appium自己的Android驱动程序我尝试以下(创建驱动程序后,当然):

Location currLocation = new Location(28.41936, -81.5812, 0.0); 

      //Set Current Location for 
      myDriver.setLocation(currLocation); 

但司机似乎“挂”在这里。没有调试输出可以得到我。它只是......阻塞,直到事情最终超时。

而且,我也尝试了所有上述Google地图移动应用程序,但它也无法响应我发送的当前位置坐标。

所以,我卡住了!

有没有人真的有幸与PROGRAMMATICY发送“地理修复”命令到他们的应用程序下测试API23 AVD创建与Android Studio 2+?

由早于2.0版本的Android Studio创建的AVD不能用于我的目的。

任何有关我在做什么错误或可能的解决方法的反馈将不胜感激!

感谢,

沃尔夫

回答

0

尝试清除该文件:〜/ .emulator_console_auth_token(或创建一个空的)


我在同样的情况。但是,我发现了一些可能有用的东西。在模拟器25.1.6的最新版本中,auth命令现在是使用Telnet时必须发出的必需的第一个命令。

http://tools.android.com/recent/emulator2516releasenotes

所以禁用它可以使〜/ .emulator_console_auth_token一个空文件。这似乎修复adb usage ge geo修复X的使用Y

我怀疑adb没有发出此auth命令,并且宁愿使用安全方法。所以我仍在研究。

此外,我还没有尝试过所有场景,但我也在AVD设置>位置>模式中启用了高位,因此可以使用Google位置服务。

的方式我测试: 1.清除.emulator_console_auth_token 2.推出模拟器(API 23,x86_64的QEMU) 3.打开谷歌地图应用 4.有人缩小的信号,它没有位置 5。 adb emu geo fix 37 -122 6.地图放大位置。

我希望这会有所帮助。

+0

嗨吉尔吉森,谢谢你的好评!我会给你空的令牌技巧,试试我得到的下一个机会!但是,在我已经连接了有效的身份验证令牌后,我在代码中使用了ADB命令,但它们仍然没有工作。我本可以解决一些问题。 – Wulf

+0

酷我很高兴你找到了发送位置和路线!也感谢lat/long的逆转。我会检查出来,也许它会让我继续使用身份验证。最后一件事,我注意到上面你在lat/long周围对adb使用了双引号,但是当我得到它的工作时,我不会将它们作为单独的值放在双引号中:adb emu geo fix 28.4194 -81.5812设置我知道这是否有助于adb – Gilgeson

2

所以,无论你相信与否,首先发送经度,然后lattitude像这样:

geo fix "-81.5812 28.4194" 

的地理fix命令为我工作!

因此,更正后的代码如下所示:

//Send current location for our Starting Point 
       System.out.println("Sending Current Location - Starting Point"); 
       outptStream.println("geo fix -81.5812 28.4194"); 
       outptStream.flush(); 

啊...天明白这一点,兄弟。天...

我无法获得“adb emu geo fix”命令在我的代码中工作,所以我使用上面的直接“地理修复”命令,这对于设置“当前位置”非常合适。

但是,“地理修复”命令似乎不适用于我创建我的应用程序绘制到地图的路线。我有一个简单的坐标数组 - 现在所有的数据都已经过修正,然后我在一个循环中播放它们 - 但是这并不能为我提供一个在我的应用程序中遵循的路线。

有关Android Studio 2.0中的Extended控件如何将.gpx坐标发送到模拟器的任何想法,以便应用程序将此信息流作为ROUTE而不是单个当前位置读取,并逐个标记?

我希望这是有道理的。

**** UPDATE 2016年6月20日****

因此,上述问题是生病前提。在发送上述查询发送“路由”而不是“当前位置”之后不久,我发现一个一个接一个地发送“地理修复”命令的位置数组确实可以与我的应用一起工作,并且路由显示在我的应用的地图很好!我犯了两个大错误。首先,我一次发送整个阵列到我的循环,而不是一次发送一个位置命令。而且,在发送下一个“geo fix”命令之前,每次发送“geo fix”命令后,我的代码并未等待Telnet会话返回的“确定”提示。一旦我解决了这些问题,那么事情就开始奏效了!

相关问题