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

Что такое Permission?

1.0 Junior🔥 142 комментариев
#Нативная интеграция

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

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

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

Что такое Permission?

Permission (разрешение) - это права доступа, которые приложение должно запросить у пользователя для получения доступа к защищенным ресурсам на устройстве. Они необходимы для работы с камерой, микрофоном, контактами, местоположением, хранилищем и другими чувствительными данными.

Типы разрешений

Разрешения разделяются на две категории:

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

  • Подключение к интернету (INTERNET)
  • Доступ к сети (ACCESS_NETWORK_STATE)
  • Доступ к вибрации (VIBRATE)

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

  • Доступ к камере (CAMERA)
  • Доступ к микрофону (RECORD_AUDIO)
  • Доступ к местоположению (ACCESS_FINE_LOCATION)
  • Доступ к контактам (READ_CONTACTS)
  • Доступ к календарю (READ_CALENDAR)
  • Доступ к галерее (READ_EXTERNAL_STORAGE)

Запрос разрешений в Flutter

Для работы с разрешениями используется пакет permission_handler:

import "package:permission_handler/permission_handler.dart";

Future<void> requestCameraPermission() async {
  final status = await Permission.camera.request();
  
  if (status.isDenied) {
    print("Permission denied");
  } else if (status.isGranted) {
    print("Permission granted");
  } else if (status.isDenied) {
    print("Permission permanently denied");
  }
}

Проверка статуса разрешения

Future<bool> hasCameraPermission() async {
  final status = await Permission.camera.status;
  return status.isGranted;
}

Запрос нескольких разрешений

Future<void> requestMultiplePermissions() async {
  final statuses = await [
    Permission.camera,
    Permission.microphone,
    Permission.location,
  ].request();
  
  statuses.forEach((permission, status) {
    print("$permission: $status");
  });
}

Открытие настроек приложения

Если разрешение было отклонено, можно предложить пользователю открыть настройки:

Future<void> openAppSettings() async {
  final status = await Permission.camera.status;
  
  if (status.isDenied) {
    openAppSettings();
  }
}

Конфигурация в AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
  <uses-permission android:name="android.permission.CAMERA" />
  <uses-permission android:name="android.permission.RECORD_AUDIO" />
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  <uses-permission android:name="android.permission.READ_CONTACTS" />
</manifest>

Конфигурация в Info.plist (iOS)

<dict>
  <key>NSCameraUsageDescription</key>
  <string>Это приложение требует доступ к камере</string>
  <key>NSMicrophoneUsageDescription</key>
  <string>Это приложение требует доступ к микрофону</string>
  <key>NSLocationWhenInUseUsageDescription</key>
  <string>Это приложение требует доступ к местоположению</string>
</dict>

Практический пример: проверка и использование камеры

class CameraScreen extends StatefulWidget {
  @override
  State<CameraScreen> createState() => _CameraScreenState();
}

class _CameraScreenState extends State<CameraScreen> {
  @override
  void initState() {
    super.initState();
    _checkPermission();
  }
  
  Future<void> _checkPermission() async {
    final status = await Permission.camera.request();
    
    if (status.isGranted) {
      print("Camera permission granted");
    } else if (status.isDenied) {
      print("Permission denied, opening settings");
      openAppSettings();
    }
  }
  
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Camera")),
      body: Center(
        child: ElevatedButton(
          onPressed: _checkPermission,
          child: Text("Request Permission"),
        ),
      ),
    );
  }
}

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

  • granted - разрешение выдано
  • denied - разрешение отклонено
  • restricted - разрешение ограничено (только iOS)
  • undetermined - пользователь еще не выбрал
  • permanentlyDenied - разрешение отклонено с опцией "Не спрашивать снова"

Лучшие практики

  1. Запрашивайте разрешения в нужный момент - когда они действительно необходимы
  2. Объясняйте зачем - покажите диалог с объяснением перед запросом
  3. Обрабатывайте отказ - предоставьте альтернативную функциональность
  4. Не запрашивайте все сразу - просите только необходимые разрешения
  5. Проверяйте статус регулярно - разрешение может быть отключено в настройках

Permission - критически важная часть для безопасности и приватности пользователей в современных мобильных приложениях.