Как правильно добавлять uses-permission в AndroidManifest.xml

Добавьте в манифест только те разрешения, которые реально нужны, объявите их до блока , а для dangerous‑разрешений реализуйте проверку и запрос в рантайме (ContextCompat.checkSelfPermission → requestPermissions / Activity Result API). Тестируйте финальный объединённый манифест перед релизом.

Как устроены разрешения и что нужно знать

  • Normal — низкорисковые (например, INTERNET). Достаточно декларации в манифесте.
  • Dangerous — доступ к чувствительным данным (камера, контакты, геолокация, хранилище). Нужна декларация и runtime‑запрос на устройствах с API 23+.
  • Signature / SignatureOrSystem — системные, обычно недоступны обычным приложениям.

Ключевое правило: без строки вы не сможете успешно вызвать requestPermissions — система вернёт отказ автоматически.

Пример минимальной декларации: xml <application ...> ...

Если у вас несколько productFlavors или библиотечных модулей — всегда проверяйте итоговый AndroidManifest после merge (Build → Analyze APK или "Merged Manifest" в Android Studio).

Практика: когда и как запрашивать разрешения в коде

  1. Не запрашивайте dangerous‑разрешение заранее — спрашивайте в момент, когда пользователь выполняет соответствующее действие (открывает камеру, хочет поделиться местоположением).
  2. Алгоритм:
    • Проверка: if (ContextCompat.checkSelfPermission(context, PERM) == PackageManager.PERMISSION_GRANTED) { … }
    • Если нет — показать объяснение в UI (короткий текст), затем вызвать запрос через Activity Result API или requestPermissions.
    • Обработать результат и корректно деградировать функционал, если разрешение не дано.
  3. Рекомендация по API: используйте Activity Result API (registerForActivityResult) — это современный и безопасный подход.

Если забыть добавить в манифест, system автоматически отклонит запрос на runtime без показа диалога.

Практичные рекомендации и подбор разрешений по функциям

  • Сеть: INTERNET, ACCESS_NETWORK_STATE. INTERNET — normal, просто в манифесте.
  • Геолокация: ACCESS_FINE_LOCATION (точно), ACCESS_COARSE_LOCATION (приблизительно). Для фоновой геолокации нужны дополнительные объяснения и REQUEST_BACKGROUND_LOCATION (особо внимательно с требованиями Play).
  • Камера/аудио: CAMERA, RECORD_AUDIO.
  • Хранилище: на современных Android используйте scoped storage, SAF и MediaStore; вместо READ/WRITE_EXTERNAL_STORAGE запрашивайте READ_MEDIA_* (Android 13+).
  • Телефон/SMS/Контакты: просите только при очевидной необходимости; такие разрешения чаще вызывают отклонение модерацией.

Используйте альтернативы: Intents на системную камеру/галерею, SAF для файлов, серверную обработку вместо локальных данных.

Частые ошибки

  • Разрешение прописано внутри — Android его игнорирует.
  • Просьба о dangerous‑perm на старте приложения без объяснения — низкая конверсия согласия.
  • Оставшиеся в манифесте старые/ненужные разрешения (например, WRITE_EXTERNAL_STORAGE) — повышают риск отклонения.
  • Не тестируют merged manifest и release‑сборку перед отправкой в Play.

Чек‑лист перед релизом: всё до , нет лишних прав, реализован runtime‑flow, UI объясняет необходимость, проверен merged manifest.

FAQ

  • Нужно ли указывать INTERNET в манифесте, если используете только WebView?
    • Да, если приложение делает сетевые запросы или WebView загружает контент из сети — указывайте INTERNET.
  • Что лучше — requestPermissions или Activity Result API?
    • Activity Result API — рекомендуется; удобнее обрабатывать результаты и меньше кода.
  • Как проверить, какие разрешения реально используются приложением?
    • Проанализируйте код и зависимости, соберите релизный AAB/APK и проверьте итоговый манифест и runtime‑вызовы в процессе тестирования.

(Коротко: объявляйте, проверяйте, просите по ситуации и минимизируйте список разрешений — это снизит риск отклонения и улучшит доверие пользователей.)