2016-06-07 74 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會話返回的「確定」提示。一旦我解決了這些問題,那麼事情就開始奏效了!

相關問題