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는 내 용도로 사용할 수 없습니다.
내가 뭘 잘못했거나 가능한 해결 방법에 대한 의견을 보내 주시면 대단히 감사하겠습니다!
감사합니다,
울프
안녕 Gilgeson, 큰 의견에 감사드립니다! 나는 당신의 빈 토큰 트릭을 시도해 볼 기회를 줄 것이다! 그러나 유효한 인증 토큰으로 이미 연결 한 후 ADB 명령을 코드에 사용했지만 여전히 작동하지 않는 것으로 나타났습니다. 그래도 나는 무언가를 쓸어 버릴 수 있었다. – Wulf
쿨 나는 위치와 경로를 보내는 것을 모두 알아 낸 것을 기쁘게 생각합니다! 또한 위도/경도의 역전에 대해 감사드립니다. 나는 그것을 체크 할 것이고 아마도 인증을 계속 사용하게 될 것입니다. 마지막으로, adb에 대해 위도/경도 주위에 큰 따옴표를 사용하고 있지만 위의 예는 작동하도록했을 때 별도의 값으로 따옴표로 묶지 않습니다. adb emu geo fix 28.4194 -81.5812 그게 adb로 도움이되는지 나에게 안다. – Gilgeson