Kiedy aplikacje znają naszą lokalizację?

Paweł Dedio Programowanie 2019-03-09

Witajcie w kolejnym tygodniu. Dzisiaj nakreślę Wam, jak wygląda sytuacja w uzyskiwaniu lokalizacji przez aplikacje. Tak więc rozsiądźcie się wygodnie i zaczynamy!

Po co aplikacjom nasza lokalizacja?

problem gps

Na wstępie wytłumaczmy sobie, po co tak właściwie aplikacje potrzebują naszej lokalizacji. Tutaj podzieliłbym je na dwa typy: aplikacje opierające swoją główną funkcjonalność na lokalizacji oraz aplikacje używające lokalizacji jako dodatek.

W pierwszym przypadku sprawa jest dość prosta. Myślę, że za bardzo nie zastanawiamy się, po co dostęp do lokalizacji aplikacjom takim jak wszelkiego rodzaju nawigacje czy Endomondo. Rzecz ma się nieco inaczej w przypadku aplikacji, które wcale nie potrzebują lokalizacji do poprawnego działania. Część z nich wykorzystuje nasze położenie w celu udostępnienia dodatkowej funkcjonalności. Przykładowo Snapchat udostępnia nam odpowiednie filtry, w zależności od tego, w jakim mieście się znajdujemy.

Jest też ostatnia grupa aplikacji, czyli te najbardziej kontrowersyjne, które wymagają lokalizacji w sumie nie wiadomo po co. Jak uzasadnić używanie lokalizacji w aplikacji latarka? Najbardziej prawdopodobnym wyjaśnieniem jest chęć dostosowania pod nas reklam, a więc zarobku. Autor aplikacji stara się wtedy zebrać od nas jak najwięcej informacji (włączając w to naszą lokalizację), a następnie wysyła te dane do różnych serwisów reklamowych. Takie działanie oczywiście nie jest czymś dobrym, dlatego powinniśmy się wystrzegać takich aplikacji.

 

Rodzaje lokalizacji

mapy google maps aktualizacja

W Androidzie mamy dwa rodzaje pozwoleń dotyczących lokalizacji: ogólny (ACCESS_COARSE_LOCATION) oraz szczegółowy (ACCESS_FINE_LOCATION). Różnica polega na dokładności otrzymanych danych. W przypadku gdy aplikacja poprosi tylko o ogólną lokalizację, to nie będzie mogła skorzystać z danych GPS. Jedyne dane, do których będzie miała dostęp, to lokalizacja otrzymana na podstawie łącza internetowego. Jak sama nazwa wskazuje, dane takie nie są zbyt dokładne. Przeważnie otrzymamy jedynie informacje, w jakim mieście znajduje się dany użytkownik. Rzecz nieco się komplikuje, jeśli użytkownik używa jakiegoś proxy lub VPNa. Wtedy wychodzą kwiatki jak na obrazku poniżej:

W przypadku dokładnej lokalizacji aplikacja uzyskuje dostęp do danych pochodzących z GPS — w tym przypadku dokładność sięga kilku metrów. W dzisiejszych czasach rzadko zdarza się, żeby aplikacja wykorzystywała jedynie ogólną lokalizację. Wszystko dlatego, że oba typy wymagają zdobycia zgody od użytkownika. Więc skoro już prosimy o zezwolenie, to można od razu poprosić o dokładniejsze dane.

 

Stare dobre czasy

Cofnijmy się do może czasów niekoniecznie dobrych, ale na pewno starych. Konkretnie do roku 2014, kiedy premierę miał Android 5.1. Ostatni system dający programistom praktycznie nielimitowany dostęp do zasobów urządzenia (zobacz odcinek: Jak system Android oszczędza energię?). Jeśli jako programista chciałeś poznać lokalizację użytkownika, to mogłeś to zrobić praktycznie bez wysiłku. Przede wszystkim nie mieliśmy takiego systemu pozwoleń, jaki znamy teraz, więc wystarczyło tylko zadeklarować używanie lokalizacji w pliku konfiguracyjnym aplikacji. Jeśli użytkownik postanowił zainstalować Twój program, to z miejsca dostawałeś dostęp do jego lokalizacji, o ile oczywiście nie wyłączył jej w ustawieniach.

Nie było również żadnych limitów dotyczących wykonywanie działań w tle. Sam w trakcie nauki napisałem aplikację pobierającą lokalizację użytkownika co 5 minut, a następnie wysyłała ją na zewnętrzny serwer. Każda inna aplikacja mogła robić praktycznie to samo. Na szczęście to już za nami i dzisiaj to wszystko wygląda nieco lepiej.

 

Podejście tradycyjne

problem gps

Dobrze — dowiedzieliśmy się, jak to wyglądało dawniej, czas przejść do czasów teraźniejszych. W początkowych wersjach Androida do uzyskania lokalizacji korzystaliśmy z klas znajdujących się w paczce android.location. Nadal możemy z nich korzystać, ale musimy liczyć się z wieloma ograniczeniami. Nawet po otworzeniu dokumentacji dotyczącej tych klas, wita nas ostrzeżenie mówiące o tym, że nie jest to zalecany sposób pobierania lokalizacji.

Przyjmijmy, że ignorujemy wszystkie ostrzeżenia i chcemy pobrać lokalizację w ten przestarzały sposób. Sama implementacja jest dość prosta. Mówimy po prostu systemowi, że potrzebujemy pobrać lokalizację i na tym kończy się nasza rola. Możemy wybrać czy ma to być jednorazowe wydarzenie, czy chcemy dostawać aktualizacje lokalizacji co określony czas. Musimy jednak liczyć się z pewnymi konsekwencjami. Przede wszystkim sposób ten jest dość surowy. Wszystkie akcje oparte na lokalizacji (na przykład geofencing) musimy implementować na własną rękę. Co więcej, jeśli wybierzemy częste aktualizacje lokalizacji, to narazimy użytkownika na znaczy spadek poziomu naładowania akumulatora. Ostatnią istotną kwestią jest pobieranie lokalizacji. Gdy program działa w tle, w sposobie tym dostajemy rzadsze aktualizacje niż w przypadku podejścia nowoczesnego.

 

Podejście nowoczesne

Nowoczesne podejście wymaga niestety Usług Google Play, ale za to ma sporo plusów. Przede wszystkim mamy tutaj do czynienia z nieco innym podejściem. Ponieważ to nie aplikacja łączy się bezpośrednio z modułem systemowym odpowiedzialnym za lokalizację, a robią to biblioteki Google Play. Lokalizacja jest aktualizowana co pewien czas i zapisywana w pamięci podręcznej. Dzięki temu aplikacje mają natychmiastowy dostęp do ostatniej lokalizacji użytkownika, bez potrzeby czekania na połączenie z satelitami GPS. Takie podejście ma niewątpliwie wpływ na zmniejszenie zużycia baterii użytkownika.

Z perspektywy programisty sposób ten jest znacznie prostsze, a dodatkowo mamy ułatwiony dostęp do funkcji opartych na lokalizacji takich jak geofencing. Kolejną zaletą jest pobieranie lokalizacji w tle. Jak już wspominałem, w przypadku tego podejścia, dostajemy częstsze aktualizacje, niż w przypadku tradycyjnej metody.

 

Używanie lokalizacji w tle

mapy google maps udostepnianie lokalizacji

Na początku wyjaśnijmy sobie, kiedy według Google aplikacja działa w tle. Przede wszystkim jest to program, który aktualnie nie wyświetla żadnego ekranu na pierwszym planie. Z tym że tutaj są pewne wyjątki — najważniejszy z nich to tak zwany foreground service. Jest to serwis, który wykonuje się w tle, lecz jego działanie jest sygnalizowane użytkownikowi za pomocą powiadomienia, którego nie możemy wyczyścić. W ten sposób działają wszelkiego rodzaju trackery aktywności, takie jak Endomondo. Tak więc aplikacja, która nie ma aktualnie żadnego widocznego ekranu i nie sygnalizuje nam działania za pomocą powiadomienia, jest traktowana jako aplikacja działające w tle.

W Androidzie 8.0 Oreo Google wprowadziło dość radykalne limity dotyczące pobierania lokalizacji przez aplikacje niedziałające na pierwszym planie. Pobieranie przez nie naszego położenia nadal jest możliwe, lecz częstotliwość takich zapytań jest ograniczona do około kilku zapytań na godzinę. Ograniczenie takie miało na celu ograniczenie nadmiernego śledzenia użytkowników przez inne aplikacje oraz zniwelowanie zużycia baterii.

 

Tym sposobem dotarliśmy do końca kolejnego artykułu. Tradycyjnie zachęcam do pisania propozycji tematów, o których chcielibyście poczytać w ramach tej serii. Widzimy się za tydzień, gdzie opowiem o wpadkach programistów, które spowodowały ogromne szkody finansowe i nie tylko. Do zobaczenia!

Zapraszam również na największe w Polsce forum dla programistów Android. Jeśli macie pytania odnośnie do kariery programisty — zapraszam do działu Kariera programowanie. Zachęcam również do przejrzenia działu Praca oraz zlecenia dla programistów — być może to właśnie tam znajdziesz swoją pierwszą pracę.

Pozostałe odcinki serii o programowaniu.






Przewiń stronę, by przeczytać kolejny wpis
Przewiń stronę, by przeczytać kolejny wpis
x