Sobes.tech
Junior

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 normal i signature.
  • 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.