Jak działają pozwolenia w systemie Android?

7 minut czytania
Komentarze

Witajcie ponownie! Przychodzę do Was z kolejną porcją androidowej wiedzy. Dzisiaj opowiem Wam, jak z perspektywy programisty wygląda zarządzanie pozwoleniami.

Dawno, dawno temu

Najpierw cofnijmy się trochę w czasie — do początku roku 2015. Jest to okres, w którym większość urządzeń działa pod kontrolą systemu Android Lollipop oraz nieco starszych: Kitkata i Jelly Beana. Ze swojej perspektywy mogę powiedzieć, że było to wtedy prawdziwe eldorado dla programistów. Mogliśmy właściwie robić to, co chcieliśmy i kiedy chcieliśmy. Nie było praktycznie żadnych limitów wykorzystywania zasobów smartfona (również w tle). Nikt nie przejmował się zużyciem baterii ani pamięci.

Jednak przejdźmy do tego, co najbardziej dotyczy dzisiejszego odcinka, czyli pozwoleń. W tamtych czasach wyglądały one zupełnie inaczej niż dzisiaj. Wystarczyło, że w odpowiednim pliku zadeklarowałeś, z jakich uprawnień będzie korzystać twoja aplikacja. Użytkownik podczas instalacji widział je co prawda, ale miał tylko dwie możliwości: zainstalowanie aplikacji i zaakceptowania jej uprawnień lub rezygnację z instalacji. To prowadziło do wielu patologii i nadużywania uprawnień. Jednym z głośniejszych przypadków jest afera z Facebookiemw której wyszło, że aplikacja Facebooka podsłuchiwała nas cały czas i na podstawie naszych rozmów dopasowywała reklamy.

Jak jest dzisiaj?

Premiera Androida 6.0 Marshmallow wprowadziła niemałą rewolucję. Oprócz zajęcia się oszczędzaniem energii całkowicie zmienił on również model pozwoleń. Jednak trzeba tutaj przyznać wyższość systemu iOS — jego użytkownicy mieli tę funkcjonalność już dużo wcześniej.

Przejdźmy do konkretów — co się właściwie zmieniło? Krótko można odpowiedzieć, że wszystko. W nowym systemie użytkownik akceptował tylko te pozwolenia, które chciał. Dodatkowo nie robił tego przy instalacji aplikacji, lecz w czasie jej działania. Dodatkowo w każdej chwili mógł odwołać dowolne pozwolenie. Najbardziej ta zmiana uderzyła w aplikacje, które działały od kilku lat i miały dość dużą bazę użytkowników. Dawniej nikt w ogóle nie zakładał scenariusza, że możemy nie mieć danego pozwolenia w chwili kiedy chcemy z niego skorzystać. Od teraz przed każdym skorzystaniem z funkcjonalności systemu wymagającej dodatkowych uprawnień musieliśmy najpierw sprawdzić, czy w ogóle mamy do nich dostęp.

Jak to wygląda z perspektywy programisty?

Podobnie jak wcześniej, najpierw musimy zadeklarować wykorzystywane uprawnienia w odpowiednim pliku konfiguracyjnym. Jednak to nie gwarantuje, że takowe dostaniemy — teraz wszystko zależy od użytkownika. Powszechnie stosowaną praktyką jest najpierw wyświetlenie jakiegoś komunikatu, w którym tłumaczymy użytkownikowi, dlaczego potrzebujemy danego pozwolenia. Przykładowo w aplikacji, która umożliwia wysyłanie zdjęć z galerii, możemy wytłumaczyć, że pozwolenie do odczytywania plików jest nam potrzebne do wysłania wybranego przez użytkownika zdjęcia. W każdym momencie musimy mieć również gotowy scenariusz na wypadek, gdyby użytkownik nie zgodził się na udzielenie pozwolenia.

Całość można sprowadzić do sześciu kroków:

  1. Sprawdzamy, czy aplikacja ma wymagane przez nas pozwolenie
  2. Jeśli tak, to wykonujemy jakąś akcję wymagającą tego uprawnienia
  3. Jeśli nie, to pokazujemy komunikat tłumaczący, dlaczego potrzebujemy tego pozwolenia
  4. Po przeczytaniu komunikatu pokazujemy systemową kontrolkę do akceptacji wymaganych uprawnień
  5. Jeśli użytkownik zaakceptuje pozwolenia to wykonujemy naszą akcję
  6. Jeśli użytkownik nie zaakceptuje pozwolenia, to kończymy akcję i tłumaczymy mu, dlaczego nie możemy jej wykonać

Jakie są dobre praktyki?

Google w oficjalnej dokumentacji wyjaśnia, czego nie powinniśmy robić w kontekście pozwoleń.

Najważniejszą kwestią jest zminimalizowanie liczby potrzebnych pozwoleń. Jak to zrobić? Możemy korzystać z pomocy innych aplikacji — na przykład, zamiast prosić o pozwolenie na użycie aparatu, możemy zrobić zdjęcie za pomocą systemowej aplikacji aparatu i pobrać to zdjęcie do naszej aplikacji. Pewnie nieraz spotkałeś się z sytuacją, gdy jakaś aplikacja otwiera domyślną kamerę, a potem w magiczny sposób zrobione zdjęcie pojawia się z powrotem w tamtej aplikacji.

Równie istotne jest nieblokowanie działania aplikacji, jeśli użytkownik nie udzielił jakiegoś pozwolenia. Pisałem już trochę wyżej, że musimy przygotować jakieś alternatywne scenariusze. Przykładowo, jeśli mamy aplikację pogodową i użytkownik nie zgodzi się na wykorzystanie lokalizacji, możemy umożliwić mu ręczne wpisanie miejscowości, dla której chciałby poznać pogodę. Warto wtedy pokazać jakiś komunikat informujący użytkownika, że gdyby udzielił pozwolenia, to mógłby wygodniej korzystać z naszej aplikacji.

Kolejną istotną kwestią jest dokładne wyjaśnienie, dlaczego potrzebujemy danego pozwolenia? W dzisiejszych czasach użytkownicy coraz bardziej dbają o swoją prywatność. Jeśli prosisz o pozwolenia takie jak lokalizacja, dostęp do mikrofonu czy plików telefonu, to musisz to naprawdę dobrze uzasadnić. Badania przeprowadzone przez profesora Jasona Hong udowodniły, że użytkownicy stają się bardziej spokojni, jeśli wiedzą, do czego konkretnie aplikacja używa ich lokalizacji lub innych wrażliwych informacji.

Ostatnią bardzo ważną rzeczą jest pytanie o pozwolenia tylko w momencie, gdy ich potrzebujemy. Wiele aplikacji (szczególnie zaraz po wejściu na rynek Androida 6.0 Marshmallow) poszło na łatwiznę i działało na zasadzie szantażu. Przy starcie aplikacja pytała o wszystkie potrzebne pozwolenia jednocześnie, a jeśli użytkownik na któreś się nie zgodził, to aplikacja przestawała działać. Coś takiego jest nieakceptowalne — jeśli widzę coś takiego, to od razu usuwam taką aplikację z telefonu. Pytanie o pozwolenie powinno występować tylko w odpowiednim momencie i kontekście. Na przykład powinniśmy pytać o dostęp do lokalizacji, dopiero gdy użytkownik otworzy ekran z mapą. Dzięki temu użytkownik będzie mógł lepiej zrozumieć, po co nam dane pozwolenie.

Nie o wszystkie pozwolenia musimy pytać

W androidzie wyróżniamy dwa (od Androida 8.1 Oreo trzy, ale tutaj to nieistotne) typy pozwoleń: niebezpieczne (dangerous) oraz normalne (normal).

Pozwolenia normalne to takie, które nie stanowią jakiegoś niebezpieczeństwa dla użytkownika. Deklarujemy je w pliku konfiguracyjnym aplikacji, ale zostają one przydzielone już w momencie instalacji aplikacji. Zaliczamy do nich między innymi dostęp do Internetu, Bluetooth, NFC, ustawianie alarmów, dostęp do wibracji i tak dalej. Pełną listę normalnych pozwoleń możecie zobaczyć w oficjalnej dokumentacji.

Pozwolenia niebezpieczne najczęściej dotyczą jakiś wrażliwych informacji o użytkowniku. Są to wszystkie pozwolenia, o które zostajesz pytany podczas użytkowania aplikacji. Nie są one przydzielane w momencie instalacji i mogą być w każdej chwili cofnięte w ustawieniach systemu. Do pozwoleń niebezpiecznych zaliczamy między innymi: dostęp do lokalizacji, kontaktów, plików i tak dalej. Pełną listę niebezpiecznych pozwoleń możecie również zobaczyć w oficjalnej dokumentacji (musicie przewinąć w dół, aż zobaczycie tabelkę).

Tym sposobem dobrnęliśmy do końca tego odcinka. Dzięki za przeczytanie! Za tydzień dowiecie się co wiedzą o nas aplikacje i jak wygląda śledzenie użytkowników. Tradycyjnie zachęcam do komentowania i pisania propozycji tematów, które chcielibyście zobaczyć w tej serii. Do zobaczenia za tydzień!

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ę.

Poprzednie odcinki:

  1. Typowy dzień pracy programisty
  2. Wady pracy programisty
  3. Zalety pracy programisty
  4. [FAQ] Wszystko, co powinieneś wiedzieć, jeśli interesuje Cię praca programisty
  5. Co mnie zdziwiło w programowaniu?
  6. Motywacje – w jaki sposób nie stracić zapału do programowania?
  7. Jaką firmę wybrać na początku kariery programisty?
  8. Jak wygląda rozmowa o pracę na stanowisko programisty?
  9. Jak zacząć programować?
  10. Skąd czerpać wiedzę o programowaniu?
  11. Początki programowania — jaką technologię wybrać?
  12. Cykl życia aplikacji na Androida — co to takiego?
  13. Jak tworzymy interfejs użytkownika w aplikacjach na Androida?
  14. Jak system Android oszczędza energię?
  15. Jak działają i czym są powiadomienia push w Androidzie?
  16. W jaki sposób aplikacje pobierają dane z zewnętrznych serwisów i czym jest API?

Motyw