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