1. diel - Android - Úvod do oprávnenia aplikácií
Vitajte v Android kurzu, v ktorom si vysvetlíme problematiku oprávneniach
(permissions) našim aplikáciám. Budeme sa venovať najmä tým pre zariadenia
s verziou API 23 a vyššie, kde je nutné oprávnenie udeľovať pri behu
aplikácie a už nie sú poskytovaná automaticky systémom pri inštalácii.
Máme teda novú problematiku, ktorou sa musíme ako Android vývojári
zaoberať, aby naše aplikácie používateľom nepadali na výnimku
SecurityException
.
Oprávnenie
Účelom oprávnenia je ochrana súkromia užívateľa. Žiadna aplikácia v predvolenom nastavení nemá oprávnenie vykonávať žiadne operácie, ktoré môžu potenciálne nepriaznivo ovplyvniť iné aplikácie, operačný systém alebo používateľa. Systém niektoré oprávnenia udeľuje automaticky a iné až po súhlase používateľa v závislosti od závažnosti daného oprávnenia.
Kategórie oprávnenia
Android delia oprávnenia do dvoch kategórií podľa závažnosti:
- Normálne oprávnenia - Nepredstavujú veľké riziko pre súkromie používateľov alebo pre prevádzku zariadenia.
- Nebezpečná oprávnenia - Musí udeliť aplikáciu používateľ a mohla by potenciálne ohroziť súkromie užívateľa alebo normálnu prevádzku zariadenia. Kým užívateľ oprávnenie neudelí, aplikácia nemôže poskytovať funkcie, ktoré na tomto oprávnenie závisí.
Deklarácia oprávnenia
Každá aplikácia musí požadované povolenia (normálny i
nebezpečná spoločne) deklarovať v úvodnej časti súboru
AndroidManifest.xml
.
Príklad deklarácia požadovaných oprávnenia v manifeste by vyzeral napr. Takto:
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
Uvedený príklad vyžaduje tieto oprávnenia:
- Prístup k fotoaparátu (kamere)
- Oprávnenie k priamemu vytáčanie telefónnych hovorov
- Prístup k presnej polohe zariadenia
Udelenie normálnych oprávnenia
Tá oprávnenia z deklarácie v manifeste, ktorá patrí do kategórie normálnych oprávnenie, aplikácia od systému získa počas inštalácie do zariadenia bez interakcie s užívateľom. Tu teda nie je veľmi čo riešiť:)
Udelenie nebezpečných oprávnenia
Nebezpečná deklarovaná oprávnenia sú udeľované až na základe súhlasu používateľa. Spôsob, akým systém Android tento súhlas získa, závisí od verzie systému Android konkrétneho zariadenia:
- Android 6.0 Marshmallow (API úroveň 23) a vyššie - Užívateľ nie je v čase inštalácie upozornený na žiadne požadované povolenia. Požiadaný bude až za behu aplikácie vo chvíli, keď aplikácia bude chcieť vykonávať činnosť, ktorá dané oprávnenie vyžaduje.
- Android 5.1.1 Lollipop (API úroveň 22) alebo nižšia - Systém Android automaticky požiada užívateľa o udelenie všetkých deklarovaných nebezpečných oprávnenie už pri inštalácii aplikácie do zariadenia. Ak používateľ klikne na tlačidlo Prijať, všetky oprávnenia sú udelené v jednom okamihu. Ak používateľ žiadosť o oprávnenie zamietne, je inštalácia aplikácie ukončená. Ak aktualizácia aplikácia vyžaduje ďalšie povolenia, je používateľ vyzvaný na prijatie týchto nových oprávnení.
My sa samozrejme budeme zaoberať tým novým spôsobom, teda od API úrovne
23. V kurze budeme používať ukážkovú aplikáciu Permissions
,
ktorú si predstavíme neskôr. Obrázky tu budú práve z nej.
Príklad - Základný postup pre udelenie oprávnenia
Teraz si popíšeme to najnutnejšie povinné minimum, ktoré musíme poznať, aby sme s oprávneniami mohli pracovať. Tento postup tiež ale zároveň obsahuje úplné minimum informácií pre užívateľov. Ako príklad nám poslúži žiadosť o udelenie povolenia na prístup ku kamere zariadení.
Krok 1 - Máme už oprávnenie?
Prvým krokom je test, či už nemá aplikácie potrebné oprávnenie udelené. Táto kontrola musí prebehnúť ešte pred tým, než sa aplikácia pokúsi o prístup ku kamere. Samotný obslužný kód kontroly oprávnení vyzerá takto:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (checkSelfPermission(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) { // Oprávnění již bylo uděleno // Práce s kamerou zařízení } else { ActivityCompat.requestPermissions( MainActivity.this, new String[]{Manifest.permission.CAMERA}, PERMISSION_MINIMAL_REQUEST); } }
Celý proces začína testom, či aplikácia beží na verziu API 23 alebo
vyšší. Ak je verzia API nižší ako 23, nie je vykonané nič (pretože
užívateľ oprávnenie už udelil pri inštalácii). V opačnom prípade je
volaná metóda checkSelfPermission()
, ktorá otestuje, či
aplikácia disponuje oprávnením, ktorého názov prijíma v parametri.
Výsledkom bude vrátená hodnota typu int
, ktorá môže
nadobúdať hodnoty konštánt:
PERMISSION_GRANTED
(povolenie udelené) - Ak je právo udelené (podmienka je splnená), môže byť vykonaný kód pristupujúce ku kamere zariadení.PERMISSION_DENIED
(povolenie odopreté). Pri zistení, že oprávnenie udelené nie je, je volaná metódarequestPermissions()
.
Krok 2 - Požiadanie o oprávnení
Ak oprávnenie nemáme, tak o neho zažiadame. Metóda
requestPermissions()
má 3 parametre:
- aktuálny kontext
- polia s názvami požadovaných oprávnenia, môžeme teda žiadať o viac naraz
- hodnota typu
int
, slúžiace ako poznávacia značka pre neskoršie spracovanie odpovede v prepísané metódeonRequestPermissionsResult()
- podobne akorequestCode
pri otváraní ďalších aktivít.
Volaním requestPermissions()
požiadame o
zobrazenie systémového dialógového okna so žiadosťou o udelenie
konkrétneho oprávnenia:
Krok 3 - Reakcia na voľbu užívateľa
Akonáhle užívateľ zareaguje, systém nám zavolá metódu
onRequestPermissionsResult()
, kde zistíme, či nám užívateľ
oprávnenie udelil alebo nie. Na základe toho teda potenciálne nebezpečnú
funkčnosť v aplikácii buď budeme používať, alebo ju nesmieme spustiť,
inak by naše aplikácie spadla, viď ďalej.
Ak používateľ udelenie oprávnenia v minulosti
definitívne zamietol, dialóg mu už znovu zobrazený nebude. V tomto
prípade zavolaní metódy requestPermissions()
povedie len k
automatickému prijatie odpovede PERMISSION_DENIED
v prepísané
metóde onRequestPermissionsResult()
.
Prepísaná metóda pre spracovanie odpovede môže vyzerať takto:
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // Uživatel oprávnění udělil // Provedení akce, vyžadující udělené oprávnění } }
S volaním uvedené metódy získame tri parametre:
requestCode
- Toto je ona hodnota parametrarequestCode
metódyrequestPermissions()
, ktorú sme si sem poslali pri požiadavke o udelenie oprávnenia. Vďaka tejto hodnote spoznáme, z ktorej časti kódu túto požiadavku pochádza.permissions
- Pole textových reťazcov s oprávneniami, o ktorých udelenie bolo požiadané. Ich poradie v poli zodpovedá tomu poradí, v akom boli uvedené pri volanie metódyrequestPermissions()
.grantResults
- Pole s odpoveďami na žiadosti o udelenie oprávnenia, ktorých poradie zodpovedá poradie poľa v premennejpermissions
.
Pokiaľ užívateľ v zobrazenom dialógovom okne stlačí tlačidlo Odmietnuť, bude okno zatvorené a požadovaná akcia s fotoaparátom nebude vykonaná.
Definitívne zamietnutie
Ak dôjde k ďalšiemu vyzvanie používateľa na udelenie oprávnenia, bude zobrazené takéto okno:
Oproti prvému dialógovému oknu navyše obsahuje zaškrtávacie políčko Nabudúce sa nepýtať. Ak je toto políčko zaškrtnuté pri ďalšom odmietnutie osvedčenia, berie systém na vedomie, že si už používateľ neželá byť vypočúvaný, či toto konkrétne oprávnenie udelí - a to ani v prípade ďalšieho pokusu aplikácie toto oprávnenie získať. Nebude teda dostupná tá funkcie aplikácie, ktorá zamietnutá oprávnenie vyžaduje.
Zrušenie zamietnutí
Ak by si svoje rozhodnutie užívateľ rozmyslel a oprávnenia chcel dodatočne udeliť, musí tak urobiť pomerne komplikovanú cestou. V nastavení telefónu v zozname nainštalovaných aplikácií zobrazí detail konkrétnej aplikácie:
Zobrazí položku Oprávnenie:
A tu nájde zoznam všetkých nebezpečných oprávnenia, ktorá aplikácia požaduje v súbore manifestu. Jednotlivé oprávnenia možno udeliť alebo odoprieť nastavením prepínača.
Ako je vidieť, aj keď používateľ udelí
aplikáciu požadované povolenia, nemôžeme sa nikdy spoľahnúť na to, že
toto oprávnenie bude aplikácia mať na vždy a je nutné,
pred každým prístupom k funkcii zariadenia, vyžadujúce
oprávnenie, za behu aplikácie kontrolovať, či je oprávnenie stále
udelené. Inak by naše aplikácie spadla na výnimku
SecurityException
.
Ošetrenie žiadosti o udelenie oprávnenia od používateľa je povinné pre verzie API 23 a vyššie a Android Studio sa nás na túto skutočnosť snaží v kóde upozorniť. To sa deje, keď sa snažíme v kóde pristupovať k tým funkciám, ktoré vyžadujú udelenie nebezpečných oprávnenia.
Nevýhody základného postupu pre získanie oprávnenia
Popísaný postup dodatočného udelenie oprávnenia v nastavení zariadenia nemusí bežný používateľ poznať. Môže sa stať, že požadované povolenia definitívne zamietne, bez toho by si v tú chvíľu plne uvedomoval následky, čo sa funkčnosti aplikácie týka. Keď už nebude žiadosť o udelenie oprávnenia zobrazovaná, daná funkcia nebude dostupná a užívateľ získa dojem, že aplikácia nefunguje, na Google Play vašej aplikácii negatívne ohodnotia a nakoniec jej zo svojho zariadenia odinštaluje.
Preto je viac než dobré popísaný základný postup získania oprávnenia rozšíriť tak, aby bol používateľ dostatočne informovaný. S týmto rozšíreným postupom sa zoznámime ďalej v kurze.
V budúcej lekcii, Android - Spoľahlivejšie postup pre získanie oprávnenia , sa naučíme, ako prinútiť používateľov dať našej Android aplikáciu potrebné oprávnenia s oveľa vyššou pravdepodobnosťou, než len s normálnou žiadostí.