RunTime Permissions - obsłuż dialogi konieczne do zezwolenia praw! (API Level 23)

Zdarza się, że aplikacja podczas wykonywania różnych działań, może potrzebować dostępu do danych nie ze swojej lokalnego storage’a, lecz pobierania informacji od innych aplikacji lub systemu. Aby miała do tego dostęp, potrzebuje na to zezwolenia - prawa do pobrania tych właśnie informacji.

W zależności od wersji systemu Android, na którym uruchamiamy aplikację, a także docelowego sdk pod którym jest budowana - targetSdkVersion w różny spsób aplikcja otrzymuje te uprawnienia.


Przyjżymy się więc, jak było do tej pory, a więc w starszych wersjach Adroida:

Wersja <= Android 5.1.1 (API level 22) || targetSdkVersion <= 22 :

drawing Są to tak zwane "Install-time requests", zapytanie to jest generowane automatycznie podczas instalacji aplikacji, natomiast programista musi dodać tylko odpowiedni wpisu w pliku manifestu:
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 


Natomiast od nowszych wersjach Androida i budowania aplikacji, nastąpiły znaczące zmiany, mające na celu zwiększenie bezpieczeństwa:

Wersja >= Android 6.0 (API level 23) && targetSdkVersion >= 23 :

drawing Są to tak zwane "Runtime reuests" , użytkownik już nie jest pytany o zezwolenia podczas instalacji aplikacji, lecz podczas działania programu - w momencie w którym rzeczywiście dostęp do jakiegoś zasobu będzie potrzebny. Jednak tym razem programiście nie wystraczy zadeklarować wyżej wymienionego wpisu w manifeście, ale również "zapytać" użytkownika o te pozwolenia. Warto wspomnieć że dotyczy to tylko uprawnień oznaczonych jako "dangerous", gdyż uprawnienia oznaczone jako "normal", są zapewnione przez system już przy instalacji. Jakiego rodzaju jest zezwolenie, które potrzebujesz, można sprawdzić w dokumentacji : click

jakie metody by nam sie przydaly? no napewno do sprawdzania czy uprawnienia sa juz nadane, jakas metoda do wysylania zadania o zezwolenia i jakis handler ktory nam opowie moment zaakceptowania lub odrzucenia ich.
ContextCompat.checkSelfPermission(context, Manifest.permission.GET_ACCOUNTS) == PackageManager.PERMISSION_GRANTE