← Назад к вопросам
Какие знаешь типы Permission?
1.6 Junior🔥 191 комментариев
#Dart#Нативная интеграция
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Типы разрешений (Permissions) в Flutter
Пермиссии используются для доступа к чувствительным данным и функциям устройства. В Flutter есть несколько способов классификации разрешений и их запроса.
Платформенные разрешения
Android разрешения (AndroidManifest.xml)
Нормальные разрешения (Normal Permissions) — автоматически предоставляются:
android.permission.INTERNETandroid.permission.ACCESS_NETWORK_STATEandroid.permission.CHANGE_NETWORK_STATEandroid.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— доступ к HealthKitNSHealthUpdateUsageDescription— изменение 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
- Запрашивай только необходимые разрешения при их использовании (Just-in-Time)
- Объясни пользователю зачем нужно разрешение перед запросом
- Обработай все статусы: granted, denied, restricted, limited, permanentlyDenied
- Открывай настройки если пользователь отклонил навсегда
- Для iOS 14+ добавляй PHAccessLevelReadWrite в Info.plist для фото
- Проверяй разрешения перед использованием функции, а не только при запуске
Проверка разрешений
Bool hasPermission(Permission permission) async {
final status = await permission.status;
return status.isGranted;
}
Bool shouldShowRationale(Permission permission) async {
return await permission.shouldShowRequestRationale;
}