2016-06-07 2 views
1

GPS 좌표를 보내야하는 Android Studio 2.1.1로 만든 x86 API23 AVD (Google API 포함)가 있습니다. 필자는 명령 행에서 "adb emu geo fix"명령을 사용하거나 Telnet을 통해이 작업을 광범위하게 읽었습니다. 인증 후 위도, 경도 및 옵션 고도 매개 변수와 함께 지오 픽스 명령을 보내십시오 라인뿐만 아니라.프로그래밍 방식으로 Android Studio 2.0 AVD에 GPS 위치를 보내는 방법

Mac OSX El Capitan 상자에서 코드를 실행하고 있습니다.

문제는 내 응용 프로그램 - 내가 보내는 GPS 좌표를 입력해야하는 응용 프로그램이 마치 데이터를 가져 오지 않는 것처럼 동작한다는 것입니다.

AVD 자체의 확장 컨트롤을 사용하여 SEND 단추와 함께 현재 위치를 보내거나 .gpx 파일에서로드 된 경로 데이터를 재생하면 모두 정상적으로 작동합니다. 앱이 GPS 데이터를 가져오고 예상대로 작동합니다.

문제는 AVD를 시작한 다음 GPS 데이터를 보내고 테스트중인 내 응용 프로그램이 올바른 피드를 받았을 때 예상대로 작동하는지 확인해야하는 테스트 자동화 (Appium, Java, TestNG)를 실행하고 있다는 것입니다. GPS 데이터.

즉, 수동으로 AVD의 확장 된 수동 컨트롤과 상호 작용할 수 없음을 의미합니다.

프로그래밍 방식으로이 모든 작업을 수행해야합니다.

다음은 현재 텔넷 명령을 통해 수행하고있는 작업입니다. 코드는 단지 "현재 위치"를 보낼과 같이 본질적으로 같습니다

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); 

을 위의 코드는 내 응용 프로그램에서 예상되는 동작을 실행하는 데 실패하면, 전혀 오류없이 작동하는 것처럼 보여도, 내가 사용

telnet localhost 5554 

기다립니다 확인을위한 내 응용 프로그램은 다음에 실행과 함께 AVD를 실행하는 터미널은 텔넷 OK 프롬프트에서 (인증 후) 다음 명령을 사용하여 수동으로 "현재 위치"를 보내 다른 터미널을 사용 ...

그런 다음 인증하십시오.

geo fix "28.4194 -81.5812" 

이 명령 프롬프트 (오류없이)에서 완벽하게 작동하는 듯하지만 내 응용 프로그램은 분명히 어떤을하지 않았다 수동으로 인증 토큰 ... 확인을위한

대기를 전송하여, 다음 전송 GPS 정보.

그래서, 난과 같이 작동 위의 명령의 ADB 버전을 사용하여 시도 :

adb emu geo fix "28.4194 -81.5812" 

를하지만이 역시 작동하지 못했습니다.

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

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

그러나 드라이버는 여기에 '정지'에 나타납니다

마찬가지로, Appium 자신의 안드로이드 드라이버를 사용하여 나는 (물론, 드라이버를 생성 한 후) 다음 시도했다. 나와 디버그 출력을 얻을 수 없습니다. 그것은 단지 ... 결국, 결국 시간이 다 될 때까지 차단됩니다.

그리고 Google Maps 모바일 앱에서도 위의 모든 것을 시도했지만, 내가 보낸 현재 위치 좌표에도 반응하지 않았습니다.

그래서 나는 붙어 있습니다!

누구나 실제로 PROGRAMMATICALLY에서 Android.2 이상으로 만든 API23 AVD에서 테스트중인 앱에 "geo fix"명령을 전송하는 행운이 있었습니까?

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 emu geo fix X와 같은 adb 사용을 수정하는 것 같습니다.

adb가이 auth 명령을 발행하지 않아서 보안 방법을 사용하는 것이 좋습니다. 그래서 나는 아직도 그것을 연구 중이다.

또한 모든 시나리오를 시도하지는 않았지만 AVD 설정> 위치> 모드를 높음으로 설정하여 Google 위치 서비스를 사용할 수 있도록했습니다.

방법은 내가 테스트 : 1. 그것은이 더 위치 5 없다고 신호를 축소했다 4. 2 출시 에뮬레이터 (API 23, x86_64에의 QEMU) 3. 오픈 구글지도 앱 .emulator_console_auth_token 클리어. adb emu geo fix 37 -122 6.지도의 위치가 확대되었습니다.

이 정보가 도움이되기를 바랍니다.

+0

안녕 Gilgeson, 큰 의견에 감사드립니다! 나는 당신의 빈 토큰 트릭을 시도해 볼 기회를 줄 것이다! 그러나 유효한 인증 토큰으로 이미 연결 한 후 ADB 명령을 코드에 사용했지만 여전히 작동하지 않는 것으로 나타났습니다. 그래도 나는 무언가를 쓸어 버릴 수 있었다. – Wulf

+0

쿨 나는 위치와 경로를 보내는 것을 모두 알아 낸 것을 기쁘게 생각합니다! 또한 위도/경도의 역전에 대해 감사드립니다. 나는 그것을 체크 할 것이고 아마도 인증을 계속 사용하게 될 것입니다. 마지막으로, adb에 대해 위도/경도 주위에 큰 따옴표를 사용하고 있지만 위의 예는 작동하도록했을 때 별도의 값으로 따옴표로 묶지 않습니다. adb emu geo fix 28.4194 -81.5812 그게 adb로 도움이되는지 나에게 안다. – Gilgeson

2

그래서, 믿거 나 말거나, 첫 경도를 전송하여, 다음과 같이 lattitude :

geo fix "-81.5812 28.4194" 

지오 수정 명령은 나를 위해 일한!

따라서, 수정 된 코드는 다음과 같습니다

//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(); 

윽 ... 일, 형제를 알아낼 수 있습니다. Days ...

"adb emu geo fix"명령을 내 코드에서 사용할 수 없어서 위의 "지오 픽스"명령을 사용하고 있으며 "현재 위치"설정에 적합합니다.

그러나 "geo fix"명령이 내 앱이지도로 그릴 경로를 만드는 데 적합하지 않은 것으로 보입니다. 나는 간단한 좌표 배열을 가지고 있습니다. 이제는 모두 lat와 long을 제공하도록 수정되었으며, 루프에서 재생했습니다. 그러나 이것은 내 앱에서 따라야 할 ROUTE를 제공하지 않습니다.

Android Studio 2.0의 확장 컨트롤이 에뮬레이터에 .gpx 좌표를 보내어 앱이이 정보 스트림을 하나의 현재 위치가 아닌 하나의 현재 위치가 아닌 ROUTE로 읽는 방법에 대한 아이디어가 있습니까?

나는 의미가 있기를 바랍니다.

**** UPDATE 2016년 6월 20일 ****

그래서, 위의 질문은 병이 전제되었다. 오래지 않아 "현재 위치"대신 "경로"를 보내는 위의 쿼리를 게시 한 후 "geo fix"명령으로 하나씩 전송 된 위치 배열이 실제로 내 앱에서 작동하고 경로가 내 앱에 표시된다는 것을 발견했습니다. 잘지도! 나는 두 가지 큰 실수를 저질렀다. 첫째로, 한 번에 하나의 위치 명령을 보내는 대신 전체 루프를 한 번에 루프에 보냈습니다. 두 번째로, 다음 "geo fix"명령을 보내기 전에 각 "geo fix"명령을 보낸 후에 "OK"프롬프트가 텔넷 세션에서 다시 시작되기를 기다리지 않았습니다. 이러한 문제가 해결되면 모든 것이 완벽하게 작동하기 시작합니다.

관련 문제