Как разрешить все типы сетевых подключений HTTP и HTTPS в Android 9 (Pie)?
Проблема и её причина
Начиная с Android 9 (API 28), Google ввёл более строгие требования к безопасности сети. По умолчанию приложения не могут отправлять незащищённый (cleartext) HTTP-трафик. Это сделано для защиты пользователей от атак "человек посередине" (MITM). Ошибка Cleartext HTTP traffic not permitted возникает именно из-за этого ограничения.
Есть три основных способа решить эту проблему, и я покажу их от самого простого (но менее рекомендуемого) до наиболее правильного и безопасного.
Способ 1: Глобальное разрешение (для тестирования или старых приложений)
Самый быстрый способ — добавить флаг android:usesCleartextTraffic="true" в манифест. Однако Google Play может отклонить приложение с такой настройкой, если нет веских причин (например, приложение работает только с внутренними корпоративными серверами).
В AndroidManifest.xml внутри тега <application>:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" ...>
<application
android:usesCleartextTraffic="true"
...>
...
</application>
</manifest>
Способ 2: Точечное разрешение через Network Security Config (рекомендуется)
Это наиболее гибкий и безопасный подход. Вы создаёте файл конфигурации, в котором указываете, для каких доменов разрешён HTTP, а для каких — только HTTPS.
Шаг 1: Создайте файл res/xml/network_security_config.xml:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<!-- Разрешаем HTTP только для конкретных доменов -->
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">example.com</domain>
<domain includeSubdomains="true">api.example.org</domain>
</domain-config>
<!-- Для всех остальных доменов — только HTTPS -->
<base-config cleartextTrafficPermitted="false">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
</network-security-config>
Шаг 2: Укажите этот файл в манифесте:
<application
android:networkSecurityConfig="@xml/network_security_config"
...>
...
</application>
Способ 3: Программное разрешение (для динамических доменов)
Если список доменов меняется динамически, можно использовать NetworkSecurityPolicy в коде Kotlin. Но это менее удобно, и его лучше комбинировать с конфигурационным файлом.
// Проверяем, разрешён ли cleartext трафик для данного хоста
if (NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted("example.com")) {
// Выполняем HTTP-запрос
} else {
// Используем HTTPS или показываем ошибку
}
Рекомендация для вашего случая
Используйте Способ 2 (Network Security Config). Он позволяет:
- Разрешить HTTP только для тех доменов, которые вы контролируете или которым доверяете.
- Сохранить безопасность для всех остальных запросов.
- Пройти проверку Google Play без проблем (если у вас есть обоснование для HTTP).
После настройки ваш код на Kotlin будет работать без ошибок, при этом приложение останется безопасным для пользователей.
<<Альтернативный подход: Использование OkHttp с перехватчиком
Если вы используете библиотеку OkHttp (что очень распространено в современных Android-приложениях), вы можете настроить разрешение HTTP через перехватчик или клиентскую конфигурацию. Это даёт ещё больше контроля.
Пример создания OkHttp клиента, который разрешает HTTP для всех доменов (не рекомендуется для продакшена, но полезно для отладки):
val client = OkHttpClient.Builder()
.connectionSpecs(listOf(
ConnectionSpec.MODERN_TLS,
ConnectionSpec.CLEARTEXT // Разрешаем HTTP
))
.build()
// Использование
val request = Request.Builder()
.url("http://example.com/api")
.build()
client.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
Log.e("Network", "Error: ${e.message}")
}
override fun onResponse(call: Call, response: Response) {
Log.d("Network", "Response: ${response.body?.string()}")
}
})
Обратите внимание: этот метод работает только в связке с android:usesCleartextTraffic="true" в манифесте или с правильной конфигурацией network_security_config.xml. OkHttp сам по себе не обходит системные ограничения Android 9+.
Для продакшена лучше комбинировать OkHttp с Network Security Config, чтобы иметь полный контроль на обоих уровнях: системном (Android) и прикладном (библиотека).