Урок Kotlin в Android Studio: ConnectivityManager

Большинство функций приложения работают только при наличии доступа к интернету. Например, вы не сможете загрузить новости, отправить сообщение или обновить информацию, если у вас нет подключения. Если попытаться выполнить сетевой запрос без интернета, программа может зависнуть или выдать ошибку. Поэтому важно сначала убедиться в наличии интернета, а затем выполнять какие-либо действия. В этом уроке для Android Studio мы используем язык Kotlin, чтобы написать простую проверку подключения через ConnectivityManager. Это встроенный инструмент системы, который не требует дополнительных библиотек.


Что такое ConnectivityManager

ConnectivityManager — это системный сервис, который отвечает за всё, что связано с сетевыми подключениями: мобильный интернет, Wi-Fi, Ethernet. Он знает, есть ли связь в данный момент, какой тип подключения активен и даже может сообщить о пропускной способности. Для базовой проверки нам достаточно узнать, подключено ли устройство к любой сети и есть ли реальный доступ в интернет.

В прошлом использовали метод getActiveNetworkInfo(), но начиная с Android 10 он стал deprecated. Современный подход — использовать getActiveNetwork() и NetworkCapabilities. Мы рассмотрим оба варианта, чтобы код работал и на старых устройствах.


Добавляем разрешение в манифест

Для получения информации о сети требуется разрешение ACCESS_NETWORK_STATE. Оно не относится к опасным, поэтому пользователю не нужно его подтверждать вручную — достаточно объявить в манифесте.

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

Если ваше приложение также будет выполнять сетевые запросы, не забудьте про INTERNET. Но для простой проверки наличия сети оно не требуется.


Функция проверки для современных версий Android

Метод getActiveNetwork() возвращает текущий активный Network или null, если соединения нет. Получив Network, можно запросить его возможности — NetworkCapabilities. У этого объекта проверяем, есть ли хотя бы одно из свойств: NET_CAPABILITY_INTERNET (доступ в интернет) и что сеть не находится в режиме настройки (например, captive portal).

fun isNetworkAvailable(context: Context): Boolean {
    val connectivityManager =
        context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    val network = connectivityManager.activeNetwork ?: return false
    val capabilities = connectivityManager.getNetworkCapabilities(network) ?: return false
    return capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
}

Этот метод корректно работает начиная с Android 6 (API 23) и является рекомендуемым.


Поддержка старых устройств

Если ваше приложение должно работать на Android 5 и ниже, можно добавить fallback к устаревшему activeNetworkInfo. Он возвращает объект NetworkInfo, у которого есть метод isConnected. При этом сам вызов метода нужно обернуть в подавление предупреждения о deprecated.

@Suppress("DEPRECATION")
fun isNetworkAvailableLegacy(context: Context): Boolean {
    val connectivityManager =
        context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    val networkInfo = connectivityManager.activeNetworkInfo
    return networkInfo != null && networkInfo.isConnected
}

Лучше объединить оба подхода: сначала попробовать новый способ, а если он не сработал — откатиться к старому. Или вовсе ориентироваться на минимальную поддерживаемую версию Android, которая в современных проектах обычно 21+.


Добавляем проверку в Activity

Создадим простой экран с кнопкой и текстовым полем. При нажатии на кнопку будем проверять сеть и показывать результат. Код пишем в MainActivity.kt.

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val btnCheck = findViewById<Button>(R.id.btnCheck)
        val tvResult = findViewById<TextView>(R.id.tvResult)

        btnCheck.setOnClickListener {
            val online = isNetworkAvailable(this)
            if (online) {
                tvResult.text = "Интернет доступен"
            } else {
                tvResult.text = "Нет подключения"
            }
        }
    }
}

Разметка для тестового экрана

В activity_main.xml добавим вертикальный LinearLayout с кнопкой и текстом. Можно разместить их по центру экрана, чтобы было наглядно.

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">

    <Button
        android:id="@+id/btnCheck"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Проверить интернет" />

    <TextView
        android:id="@+id/tvResult"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:textSize="20sp" />
</LinearLayout>

Полезные советы

  • Не полагайтесь только на проверку перед запросом. Сеть может пропасть прямо во время загрузки данных. Всегда обрабатывайте ошибки сетевых вызовов.
  • Используйте NetworkCallback. Если нужно следить за состоянием сети непрерывно (например, показывать баннер «Нет интернета»), зарегистрируйте NetworkCallback. Он будет сообщать о каждом изменении подключения.
  • Тестируйте на эмуляторе и реальном устройстве. Эмулятор всегда показывает сеть, если не отключить её вручную через настройки или иконку в панели инструментов.

Коротко о главном

Сегодняшний урок в Android Studio на Kotlin показал, как быстро узнать, есть ли интернет на устройстве. Вы познакомились с ConnectivityManager, современным методом getActiveNetwork() и написали функцию, которую можно вставить в любой проект. Теперь перед каждым сетевым запросом вы сможете предупредить пользователя или просто не делать лишнюю работу. Попробуйте дополнить пример: меняйте цвет текста в зависимости от результата проверки — это сделает интерфейс ещё дружелюбнее.