Sobes.tech
Junior

Aké typy povolení existujú vo Flutter aplikáciách?

sobes.tech AI

Odpoveď od AI

Oprávnenia v aplikáciách Flutter sú riadené operačným systémom zariadenia (Android alebo iOS). Flutter poskytuje prístup k príslušným API platformy na žiadosť a kontrolu týchto oprávnení.

Hlavné typy oprávnení:

  • Oprávnenia pri inštalácii (Install-time permissions): Sú automaticky udelené pri inštalácii aplikácie. Nevyžadujú explicitnú žiadosť od používateľa počas behu aplikácie. V Androide patria do kategórií normal a signature.
  • Oprávnenia pri behu (Runtime permissions): Najdôležitejšie a najcitlivejšie oprávnenia, ako prístup k polohe, kamere, mikrofónu, kontaktom a súborom. Vyžadujú explicitnú žiadosť počas behu aplikácie. Používateľ môže takéto oprávnenie udeliť alebo odmietnuť. V Androide patria do kategórie dangerous.
  • Špeciálne oprávnenia (Special permissions): Oprávnenia, ktoré vyžadujú špeciálnu interakciu s používateľom na ich udelenie, napríklad oprávnenie na kreslenie nad inými oknami (ACTION_MANAGE_OVERLAY_PERMISSION) alebo zápis do systémových nastavení (WRITE_SETTINGS).

Flutter používa pluginy na interakciu s API platformy a správu oprávnení. Najrozšírenejší plugin je permission_handler.

Pri práci s permission_handler sa používajú nasledujúce stavy oprávnení:

  • granted: Oprávnenie bolo udelené.
  • denied: Oprávnenie bolo odmietnuté (možno znovu požiadať).
  • restricted: Oprávnenie je obmedzené platformou.
  • permanentlyDenied: Oprávnenie bolo definitívne odmietnuté, je potrebné nasmerovať používateľa do nastavení aplikácie.
  • limited: Oprávnenie je čiastočne udelené (napríklad prístup iba k vybraným fotografiám v iOS).

Príklad žiadosti o prístup k fotoaparátu:

import 'package:permission_handler/permission_handler.dart';

// Asynchrónna funkcia na žiadosť o oprávnenie
Future<void> requestCameraPermission() async {
  // Získanie stavu oprávnenia
  var status = await Permission.camera.status;
  // Ak oprávnenie ešte nie je udelené
  if (status.isDenied) {
    // Žiadosť o oprávnenie
    status = await Permission.camera.request();
    // Kontrola stavu po žiadosti
    if (status.isGranted) {
      // Oprávnenie bolo udelené, môžeme použiť kameru
      print('Oprávnenie k fotoaparátu bolo udelené');
    } else if (status.isPermanentlyDenied) {
      // Oprávnenie bolo trvalo odmietnuté, nasmerujeme používateľa do nastavení
      print('Oprávnenie k fotoaparátu bolo trvalo odmietnuté, otvorte nastavenia');
      openAppSettings(); // funkcia z permission_handler
    } else {
      // Oprávnenie bolo odmietnuté, ale môže sa znovu požiadať
      print('Oprávnenie k fotoaparátu bolo odmietnuté');
    }
  } else if (status.isGranted) {
    // Oprávnenie je už udelené
    print('Oprávnenie k fotoaparátu je už udelené');
  }
}

Je potrebné pridať príslušné oprávnenia do súborov manifestu pre Android (android/app/src/main/AndroidManifest.xml) a Info.plist pre iOS (ios/Runner/Info.plist).

Príklad pridania oprávnenia do AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Oprávnenie na prístup k fotoaparátu -->
    <uses-permission android:name="android.permission.CAMERA"/>
    <application
        ...>
        <!-- Vaše aktivity -->
    </application>
</manifest>

Príklad pridania popisu použitia oprávnenia do Info.plist (pre iOS, vyžaduje sa pre oprávnenia pri behu):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	...
	<!-- Popis dôvodu použitia kamery -->
	<key>NSCameraUsageDescription</key>
	<string>Táto aplikácia používa vašu kameru na snímanie fotografií.</string>
	...
</dict>
</plist>

Je dôležité žiadať o oprávnenia v správnom okamihu, keď sa funkcia, ktorá ich vyžaduje, používa, aby sa predišlo negatívnej používateľskej skúsenosti.