0 komentarzy

Emulowanie lokalizacji w module GPS urządzenia wirtualnego AVD

Sierpień 12, 2011 Geolokalizacja Narzędzia

Dzisiejszy wpis przeznaczony jest dla programistów, którzy chcą tworzyć aplikacje związane z geolokalizacją, a nie posiadają prawdziwego urządzenia z modułem GPS (lub po prostu nie chce im się ruszać sprzed biurka ;) ). Jak się bowiem okazuje Android SDK wraz z debugerem DDMS w Eclipse pozwalają na emulowanie urządzenia GPS. I co najważniejsze, możliwości na wykorzystanie tych narzędzi mamy kilka.

Tworzenie AVD emulującego GPS

Aby nasze urządzenie wirtualne obsługiwało wysyłany przez nas sygnał GPS, podczas jego tworzenia należy w dziale hardware dodać atrybut GPS support. Nic nie stoi na przeszkodzie by taki moduł dodać również do już istniejącego urządzenia (Android SDK and AVD Manager -> Virtual Devices -> wskazujemy urządzenie wirtualne -> Edit -> dodajemy moduł).

Teraz wystarczy tylko odpalić nasz emulator i gotowe – mamy urządzenie wirtualne potrafiące emulować moduł GPS.

Wysyłanie sygnału GPS do emulatora

Wysyłanie pozycji z debugera DDMS

W perspektywie DDMS, w Eclipse mamy zakładkę, która nazywa się Emulator Control. To za jej pomocą można m.in. wywoływać połączenia przychodzące czy ustawiać prędkość sieci.

Tam też mamy dział Location Controls.
Pierwsza zakładka, Manual, pozwala nam na ręczne przesłanie pozycji – albo jako liczby zmiennoprzecinkowej albo za pomocą stopni, minut i sekund kątowych.

Po kliknięciu Send powinniśmy w naszej aplikacji ujrzeć zaktualizowane dane.

Uwaga – jeżeli ktoś spotka się z problemem ukazanym powyżej (dane nie do końca zgadzają się), oto dwie możliwe przyczyny takiego stanu rzeczy:

  • Bug w środowisku (prawdopodobnie gdzieś w DDMS). Aby to naprawić, należy w pliku eclipse.ini dodać dwie linijki:
    -Duser.country=US
    -Duser.language=en

    co powinno załatwić sprawę.
  • Drugi problem, którego niestety nie udało mi się rozwiązać, a występuje akurat w mojej konfiguracji związany jest prawdopodobnie z 64bitową wersją systemu oraz IDE, a 32bitową wersją emulatora. Wydaje mi się, że problem występuje gdzieś w momencie konwersji liczby zmiennoprzecinkowej (lokalizacja występuje jako typ double).
    Domysły swoje opieram na tym, że zaraz obok mam laptopa z tym samym systemem w wersji 32 bitowej, dokładnie tym samym oprogramowaniem i tam już powyższy problem nie występuje.

Wysyłanie trasy z debugera DDMS

Drugą funkcjonalnością jaką dostarcza nam DDMS jest wysyłanie całej trasy za pomocą plików GPX oraz KML. Dzięki temu w naszym urządzeniu wirtualnym możemy emulować ruch. Odbywa się to za pomocą drugiej oraz trzeciej zakładki (GPX,KML), gdzie możemy ładować odpowiednie pliki z trasami.

Kolejna uwaga – pliki GPX musi być zapisany w wersji 1.1, ponieważ tylko taką obsługuje DDMS (uwaga do tych, którzy korzystają z aplikacji My Tracks – tam plik GPX generowany jest w wersji 1.0).

Wysyłanie lokalizacji przez konsolę

Jeżeli ktoś preferuje inne IDE przez co nie posiada debugera DDMS istnieje jeszcze jedna możliwość na wysyłanie lokalizacji do naszego emulatora.
Odbywa się to za pomocą protokołu telnet.

Wystarczy, że połączymy się z emulatorem poprzez:

telnet localhost 5554

oczywiście w miejsce 5554 wstawiamy port pod którym działa nasz emulator (5554 jest domyślny).

Kiedy podłączymy się do Android Console możemy skorzystać z dwóch komend:

  • geo fix
  • geo nmea

w dokumentacji można znaleźć ich dokładny opis. Poniżej przykład użycia:

Android Console: type 'help' for a list of commands
OK
geo fix 50.3041 19.5617999
OK

który zadziała dokładnie tak samo jak wysłanie pozycji z debugera DDMS.

Ustawianie pozycji bezpośrednio w kodzie aplikacji

Ostatnią metodą, która pozwala na emulowanie pozycji jest ustawienie jej bezpośrednio w kodzie aplikacji. Aby to zrobić wystarczy wywołać metodę setTestProviderLocation(String, Location) na obiekcie LocationManager, która przyjmuje dwa parametry:

  • Nazwę dostawcy danych, któremu wpisujemy położenie,
  • obiekt Location, który posiada wpisane przez nas dane.

Oczywiście aby wstawić własne dane, na obiekcie Location należy wywołać metody setLatitude(double) oraz setLongitude(double).

Komentarze (0) Subskrybuj

Prześlij komentarz

Zaloguj się lub skorzystaj z profilu:

[rpxlogin redirect="http://www.android4devs.pl" prompt="" style="large"]

Możesz również zostawić komentarz bez rejestracji, korzystając z poniższego formularza:

Musisz być zalogowany aby móc pisać komentarze.