【发布时间】:2016-10-06 17:54:00
【问题描述】:
我有一个使用 Android Studio 2.1.1 创建的 x86 API23 AVD(带有 Google API),我需要向其发送 GPS 坐标。我已经广泛阅读了有关使用命令行中的“adb emu geo fix”命令或通过 telnet 执行此操作的内容——在进行身份验证后,然后在命令中发送 geo fix 命令以及纬度、经度和可选的高度参数也行。
我在 Mac OSX El Capitan 机器上运行我的代码。
问题在于,我的应用程序(需要为我发送的 GPS 坐标提供数据的应用程序)表现得好像没有获取任何数据一样。
如果我使用 AVD 本身的扩展控件通过 SEND 按钮发送相同的当前位置,或者播放从 .gpx 文件加载的路线数据,那么一切正常。该应用程序获取 GPS 数据并按预期运行。
问题是我正在运行测试自动化(Appium、Java、TestNG),它需要启动 AVD,然后发送 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 OK 提示符下使用以下命令(通过身份验证后)手动发送“当前位置”:
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);
但驱动程序似乎在这里“挂起”。我无法获得任何调试输出。它只是......阻塞,直到事情最终超时。
而且,我也用谷歌地图移动应用尝试了上述所有方法,但它也无法对我发送的当前位置坐标做出反应。
所以,我被卡住了!
在使用 Android Studio 2+ 创建的 API23 AVD 上,是否有人真正幸运地以编程方式向他们正在测试的应用发送“geo fix”命令?
Android Studio 2.0 之前的版本创建的 AVD 不能用于我的目的。
任何关于我做错了什么或可能的解决方法的反馈将不胜感激!
谢谢,
乌尔夫
【问题讨论】:
标签: android gps geolocation appium telnet