← Назад к вопросам

Какие знаешь типы Permission?

1.6 Junior🔥 191 комментариев
#Dart#Нативная интеграция

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Типы разрешений (Permissions) в Flutter

Пермиссии используются для доступа к чувствительным данным и функциям устройства. В Flutter есть несколько способов классификации разрешений и их запроса.

Платформенные разрешения

Android разрешения (AndroidManifest.xml)

Нормальные разрешения (Normal Permissions) — автоматически предоставляются:

  • android.permission.INTERNET
  • android.permission.ACCESS_NETWORK_STATE
  • android.permission.CHANGE_NETWORK_STATE
  • android.permission.WRITE_EXTERNAL_CACHE

Опасные разрешения (Dangerous Permissions) — требуют запроса у пользователя:

  • Камера: android.permission.CAMERA
  • Локация: android.permission.ACCESS_FINE_LOCATION, android.permission.ACCESS_COARSE_LOCATION
  • Контакты: android.permission.READ_CONTACTS, android.permission.WRITE_CONTACTS
  • Календарь: android.permission.READ_CALENDAR, android.permission.WRITE_CALENDAR
  • Файлы: android.permission.READ_EXTERNAL_STORAGE, android.permission.WRITE_EXTERNAL_STORAGE
  • Микрофон: android.permission.RECORD_AUDIO
  • Здоровье: android.permission.READ_HEALTH_DATA
  • SMS: android.permission.READ_SMS, android.permission.SEND_SMS

iOS разрешения (Info.plist)

  • NSCameraUsageDescription — доступ к камере
  • NSLocationWhenInUseUsageDescription — локация во время использования
  • NSLocationAlwaysAndWhenInUseUsageDescription — постоянная локация
  • NSContactsUsageDescription — доступ к контактам
  • NSCalendarsUsageDescription — доступ к календарю
  • NSPhotoLibraryUsageDescription — доступ к галерее
  • NSMicrophoneUsageDescription — доступ к микрофону
  • NSHealthShareUsageDescription — доступ к HealthKit
  • NSHealthUpdateUsageDescription — изменение HealthKit

Статусы разрешений

enum PermissionStatus {
  granted,        // Разрешение выдано
  denied,         // Пользователь отклонил
  restricted,     // Ограничено (например, родительский контроль)
  limited,        // Частичный доступ (iOS только)
  permanentlyDenied, // Пользователь отклонил и выбрал "Не спрашивать"
}

Использование permission_handler пакета

import "package:permission_handler/permission_handler.dart";

// Запрос одного разрешения
final status = await Permission.camera.request();

if (status.isGranted) {
  // Разрешение получено
} else if (status.isDenied) {
  // Пользователь отклонил
} else if (status.isPermanentlyDenied) {
  // Открыть настройки
  openAppSettings();
}

// Запрос нескольких разрешений
final statuses = await [
  Permission.camera,
  Permission.microphone,
  Permission.location,
].request();

// Проверка текущего статуса
final cameraStatus = await Permission.camera.status;

// Проверка всех разрешений
final allStatus = await Permission.camera.status;
if (allStatus.isRestricted) {
  // Действовать соответственно
}

Группы разрешений

Некоторые разрешения объединяются в группы:

  • Локация: FINE_LOCATION и COARSE_LOCATION
  • Хранилище: READ и WRITE EXTERNAL_STORAGE
  • Контакты: READ и WRITE CONTACTS
  • Календарь: READ и WRITE CALENDAR

Выдача одного разрешения из группы может выдать и другие.

Best Practices

  1. Запрашивай только необходимые разрешения при их использовании (Just-in-Time)
  2. Объясни пользователю зачем нужно разрешение перед запросом
  3. Обработай все статусы: granted, denied, restricted, limited, permanentlyDenied
  4. Открывай настройки если пользователь отклонил навсегда
  5. Для iOS 14+ добавляй PHAccessLevelReadWrite в Info.plist для фото
  6. Проверяй разрешения перед использованием функции, а не только при запуске

Проверка разрешений

Bool hasPermission(Permission permission) async {
  final status = await permission.status;
  return status.isGranted;
}

Bool shouldShowRationale(Permission permission) async {
  return await permission.shouldShowRequestRationale;
}
Какие знаешь типы Permission? | PrepBro