Sobes.tech
Junior

Jaké typy oprávnění existují ve Flutter aplikacích?

sobes.tech AI

Odpověď od AI

Oprávnění v aplikacích Flutter jsou řízena operačním systémem zařízení (Android nebo iOS). Flutter poskytuje přístup k odpovídajícím API platformy pro žádost a kontrolu těchto oprávnění.

Hlavní typy oprávnění:

  • Oprávnění při instalaci (Install-time permissions): Automaticky jsou udělena při instalaci aplikace. Nevyžadují explicitní žádost uživatele během běhu aplikace. V Androidu patří do kategorií normal a signature.
  • Oprávnění při běhu (Runtime permissions): Nejvíce důležitá a citlivá oprávnění, jako přístup k poloze, kameře, mikrofonu, kontaktům a souborům. Vyžadují explicitní žádost během běhu aplikace. Uživatel může takové oprávnění udělit nebo odmítnout. V Androidu patří do kategorie dangerous.
  • Speciální oprávnění (Special permissions): Oprávnění, která vyžadují zvláštní interakci s uživatelem pro udělení, například oprávnění pro kreslení přes jiné okna (ACTION_MANAGE_OVERLAY_PERMISSION) nebo zápis do systémových nastavení (WRITE_SETTINGS).

Flutter používá pluginy pro interakci s API platformy a správu oprávnění. Nejrozšířenější plugin je permission_handler.

Při práci s permission_handler se používají následující stavy oprávnění:

  • granted: Oprávnění bylo uděleno.
  • denied: Oprávnění bylo odmítnuto (možno znovu požádat).
  • restricted: Oprávnění je omezeno platformou.
  • permanentlyDenied: Oprávnění bylo definitivně odmítnuto, je třeba uživatele nasměrovat do nastavení aplikace.
  • limited: Oprávnění je částečně uděleno (například přístup pouze k vybraným fotografiím v iOS).

Příklad žádosti o oprávnění k přístupu ke kameře:

import 'package:permission_handler/permission_handler.dart';

// Asynchronní funkce pro žádost o oprávnění
Future<void> requestCameraPermission() async {
  // Získání stavu oprávnění
  var status = await Permission.camera.status;
  // Pokud oprávnění ještě není uděleno
  if (status.isDenied) {
    // Žádáme o oprávnění
    status = await Permission.camera.request();
    // Kontrola stavu po žádosti
    if (status.isGranted) {
      // Oprávnění bylo uděleno, lze použít kameru
      print('Oprávnění ke kameře bylo uděleno');
    } else if (status.isPermanentlyDenied) {
      // Oprávnění bylo trvale odmítnuto, směřujeme uživatele do nastavení
      print('Oprávnění ke kameře bylo trvale odmítnuto, otevřete nastavení');
      openAppSettings(); // Funkce z permission_handler
    } else {
      // Oprávnění bylo odmítnuto, ale lze požádat znovu
      print('Oprávnění ke kameře bylo odmítnuto');
    }
  } else if (status.isGranted) {
    // Oprávnění již bylo uděleno
    print('Oprávnění ke kameře již bylo uděleno');
  }
}

Je nutné přidat odpovídající oprávnění do souborů manifestu pro Android (android/app/src/main/AndroidManifest.xml) a Info.plist pro iOS (ios/Runner/Info.plist).

Příklad přidání oprávnění do AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Oprávnění pro přístup ke kameře -->
    <uses-permission android:name="android.permission.CAMERA"/>
    <application
        ...>
        <!-- Vaše aktivity -->
    </application>
</manifest>

Příklad přidání popisu použití oprávnění do Info.plist (pro iOS, vyžaduje se pro oprávnění při běhu):

<?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žití kamery -->
	<key>NSCameraUsageDescription</key>
	<string>Tato aplikace používá vaši kameru k pořizování fotografií.</string>
	...
</dict>
</plist>

Je důležité žádat o oprávnění ve vhodný okamžik, když je funkce, která jej vyžaduje, používána, aby se předešlo negativní uživatelské zkušenosti.