Где в Android указывается разрешение на интернет
Что проверяют
Базовое знание манифеста и модели разрешений. Короткий ответ «в AndroidManifest.xml» интервьюер ждёт за пять секунд, а дальше проверяет, понимаете ли вы, почему это разрешение не запрашивают у пользователя. Следом спрашивают, почему запрос может не пройти и с разрешением.
Как отвечать
Разрешение объявляется в app/src/main/AndroidManifest.xml дочерним элементом <manifest>, на одном уровне с <application>, а не внутри него: <uses-permission android:name="android.permission.INTERNET" />.
Дальше добавьте контекст:
- уровень защиты:
INTERNETотносится к normal permissions. Система выдаёт его при установке,requestPermissions()для него не нужен. Запрос в рантайме с Android 6.0 касается только dangerous-разрешений вроде камеры или геолокации; - соседнее разрешение: для проверки состояния сети через
ConnectivityManagerотдельно нуженACCESS_NETWORK_STATE, тоже normal; - слияние манифестов: библиотеки приносят свои манифесты, итоговый список собирает manifest merger. Посмотреть его можно на вкладке Merged Manifest в Android Studio или через APK Analyzer;
- без разрешения: сокет не открывается, в логе обычно
SocketExceptionсEPERMилиSecurityExceptionс подсказкойmissing INTERNET permission?.
Хорошо показать и соседние грабли: запрос в главном потоке даёт NetworkOnMainThreadException, а с Android 9 открытый HTTP по умолчанию запрещён для приложений с targetSdk 28 и выше. Разрешают его точечно через network_security_config для нужных доменов, а не глобальным android:usesCleartextTraffic="true".
Где спотыкаются
Кладут <uses-permission> внутрь <application>. Lint отмечает это проверкой WrongManifestParent, но если предупреждения игнорировать, разрешение не применяется, и ошибка всплывает только при первом запросе.
Пытаются запрашивать INTERNET в рантайме или путают его с опасными разрешениями. Это сразу показывает, что модель разрешений знакома поверхностно.
Добавив разрешение, считают, что сеть обязана заработать, и не проверяют остальное: HTTP без исключения в конфиге, запрос в главном потоке. Разрешение необходимо, но не достаточно.