Sobes.tech
Junior

Какви типове разрешения съществуват във Flutter приложенията?

sobes.tech AI

Отговор от AI

Разрешенията в приложенията Flutter се управляват от операционната система на устройството (Android или iOS). Flutter предоставя достъп до съответните API на платформата за заявка и проверка на тези разрешения.

Основните типове разрешения:

  • Разрешения при инсталиране (Install-time permissions): Автоматично се предоставят при инсталиране на приложението. Не изискват явна заявка от потребителя по време на работа на приложението. В Android принадлежат към категориите normal и signature.
  • Разрешения при изпълнение (Runtime permissions): Най-важните и чувствителни разрешения, като достъп до местоположение, камера, микрофон, контакти и файлове. Изискват явна заявка по време на работа на приложението. Потребителят може да предостави или откаже такова разрешение. В Android принадлежат към категорията dangerous.
  • Специални разрешения (Special permissions): Разрешения, които изискват специално взаимодействие с потребителя за предоставяне, например разрешение за рисуване върху други прозорци (ACTION_MANAGE_OVERLAY_PERMISSION) или разрешение за запис в системните настройки (WRITE_SETTINGS).

Flutter използва плъгини за взаимодействие с API на платформата и управление на разрешенията. Най-разпространеният плъгин е permission_handler.

При работа с permission_handler се използват следните статуси на разрешенията:

  • granted: Разрешението е предоставено.
  • denied: Разрешението е отказано (може да се поиска отново).
  • restricted: Разрешението е ограничено от платформата.
  • permanentlyDenied: Разрешението е окончателно отказано, необходимо е да се насочи потребителят към настройките на приложението.
  • limited: Разрешението е частично предоставено (например, достъп само до избрани снимки в iOS).

Пример за заявка за разрешение за достъп до камера:

import 'package:permission_handler/permission_handler.dart';

// Асиметрична функция за заявка на разрешение
Future<void> requestCameraPermission() async {
  // Получаване на статуса на разрешението
  var status = await Permission.camera.status;
  // Ако разрешението все още не е предоставено
  if (status.isDenied) {
    // Заявка за разрешение
    status = await Permission.camera.request();
    // Проверка на статуса след заявката
    if (status.isGranted) {
      // Разрешението е предоставено, може да използвате камерата
      print('Разрешението за камера е предоставено');
    } else if (status.isPermanentlyDenied) {
      // Разрешението е окончателно отказано, насочване към настройки
      print('Разрешението за камера е окончателно отказано, отворете настройките');
      openAppSettings(); // функция от permission_handler
    } else {
      // Разрешението е отказано, но може да се поиска отново
      print('Разрешението за камера е отказано');
    }
  } else if (status.isGranted) {
    // Разрешението вече е предоставено
    print('Разрешението за камера вече е предоставено');
  }
}

Необходимо е да добавите съответните разрешения във файловете манифест за Android (android/app/src/main/AndroidManifest.xml) и Info.plist за iOS (ios/Runner/Info.plist).

Пример за добавяне на разрешение в AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Разрешение за достъп до камера -->
    <uses-permission android:name="android.permission.CAMERA"/>
    <application
        ...>
        <!-- Вашите активности -->
    </application>
</manifest>

Пример за добавяне на описание за използване на разрешението в Info.plist (за iOS, необходимо за разрешения при изпълнение):

<?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>
	...
	<!-- Описание на причината за използване на камерата -->
	<key>NSCameraUsageDescription</key>
	<string>Това приложение използва вашата камера за заснемане на снимки.</string>
	...
</dict>
</plist>

Важно е да заявявате разрешенията в подходящия момент, когато функцията, която ги изисква, се използва, за да избегнете негативен потребителски опит.