Jakie rodzaje uprawnień istnieją w aplikacjach Flutter?
sobes.tech AI
Odpowiedź od AI
Uprawnienia w aplikacjach Flutter są zarządzane przez system operacyjny urządzenia (Android lub iOS). Flutter zapewnia dostęp do odpowiednich API platformy do żądania i sprawdzania tych uprawnień.
Główne typy uprawnień:
- Uprawnienia podczas instalacji (Install-time permissions): Są automatycznie przyznawane podczas instalacji aplikacji. Nie wymagają wyraźnego żądania od użytkownika podczas działania. Na Androidzie należą do kategorii
normalisignature. - Uprawnienia w czasie działania (Runtime permissions): To najważniejsze i najbardziej wrażliwe uprawnienia, takie jak dostęp do lokalizacji, kamery, mikrofonu, kontaktów i plików. Wymagają wyraźnego żądania od użytkownika podczas działania. Użytkownik może udzielić lub odmówić takiego uprawnienia. Na Androidzie należą do kategorii
dangerous. - Uprawnienia specjalne (Special permissions): Uprawnienia, które wymagają specjalnej interakcji z użytkownikiem, aby je przyznać, np. pozwolenie na rysowanie na innych ekranach (
ACTION_MANAGE_OVERLAY_PERMISSION) lub na modyfikację ustawień systemowych (WRITE_SETTINGS).
Flutter używa wtyczek do interakcji z API platformy i zarządzania uprawnieniami. Najczęściej używaną wtyczką jest permission_handler.
Przy pracy z permission_handler używa się następujących stanów uprawnień:
granted: Uprawnienie przyznane.denied: Uprawnienie odrzucone (można ponownie zapytać).restricted: Uprawnienie ograniczone przez platformę.permanentlyDenied: Uprawnienie ostatecznie odrzucone, konieczne skierowanie użytkownika do ustawień aplikacji.limited: Uprawnienie częściowo przyznane (np. dostęp tylko do wybranych zdjęć na iOS).
Przykład żądania uprawnienia do dostępu do kamery:
import 'package:permission_handler/permission_handler.dart';
// Funkcja asynchroniczna do żądania uprawnienia
Future<void> requestCameraPermission() async {
// Pobierz status uprawnienia
var status = await Permission.camera.status;
// Jeśli uprawnienie nie zostało jeszcze przyznane
if (status.isDenied) {
// Żądaj uprawnienia
status = await Permission.camera.request();
// Sprawdź status po żądaniu
if (status.isGranted) {
// Uprawnienie przyznane, można używać kamery
print('Uprawnienie do kamery przyznane');
} else if (status.isPermanentlyDenied) {
// Uprawnienie ostatecznie odrzucone, skieruj użytkownika do ustawień
print('Uprawnienie do kamery odrzucone na stałe, otwórz ustawienia');
openAppSettings(); // Funkcja z permission_handler do otwierania ustawień
} else {
// Uprawnienie odrzucone, można ponownie zapytać
print('Uprawnienie do kamery odrzucone');
}
} else if (status.isGranted) {
// Uprawnienie już przyznane
print('Uprawnienie do kamery już przyznane');
}
}
Ważne jest dodanie odpowiednich uprawnień do plików manifestu dla Android (android/app/src/main/AndroidManifest.xml) oraz do Info.plist dla iOS (ios/Runner/Info.plist).
Przykład dodania uprawnienia w AndroidManifest.xml:
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Uprawnienie do dostępu do kamery -->
<uses-permission android:name="android.permission.CAMERA"/>
<application
...>
<!-- Twoje aktywności -->
</application>
</manifest>
Przykład dodania opisu użycia uprawnienia w Info.plist (dla iOS, wymagane dla uprawnień w czasie działania):
<?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>
...
<!-- Opis powodu użycia kamery -->
<key>NSCameraUsageDescription</key>
<string>Ta aplikacja używa Twojej kamery do robienia zdjęć.</string>
...
</dict>
</plist>
Ważne jest, aby żądać uprawnień w odpowiednim momencie korzystania z funkcji, która ich wymaga, aby nie tworzyć negatywnego doświadczenia użytkownika.