IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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óda requestPermissions().

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óde onRequestPermissionsResult() - podobne ako requestCode 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:

Oprávnenia Android aplikácií

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 parametra requestCode metódy requestPermissions(), 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ódy requestPermissions().
  • grantResults - Pole s odpoveďami na žiadosti o udelenie oprávnenia, ktorých poradie zodpovedá poradie poľa v premennej permissions.

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:

Oprávnenia Android aplikácií

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:

Oprávnenia Android aplikácií

Zobrazí položku Oprávnenie:

Oprávnenia Android aplikácií

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


 

Všetky články v sekcii
Oprávnenia Android aplikácií
Preskočiť článok
(neodporúčame)
Android - Spoľahlivejšie postup pre získanie oprávnenia
Článok pre vás napísal Pavel
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje programování v Javě, hlavně pro Android. Mezi jeho další zájmy patří Arduino, Minecraft.
Aktivity