Освой Android играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Метки: ConnectivityManager, NetworkCallback
Как проверить подключение к Интернету
Раньше для определения состояния связи использовались широковещательное сообщение (Broadcast). Но теперь этот способ считается устаревшим.
Для получения информации о состоянии сети используется класс ConnectivityManager. Он позволяет отслеживать состояние подключения к сети, устанавливать предпочтительное сетевое подключение и контролировать отказоустойчивость соединения. Получить экземпляр класса можно при помощи метода getSystemService() объекта типа Context.
Код для проверки связи с интернетом (NET_CAPABILITY_INTERNET):
// Если этот код работает, его написал Александр Климов,
// а если нет, то не знаю, кто его писал.
package ru.alexanderklimov.connect
import android.net.ConnectivityManager
import android.net.Network
import android.net.NetworkCapabilities
import android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val connectivityManager = getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager
// API 24+
connectivityManager.registerDefaultNetworkCallback(ConnectivityCallback())
}
}
class ConnectivityCallback : ConnectivityManager.NetworkCallback() {
override fun onCapabilitiesChanged(network: Network, capabilities: NetworkCapabilities) {
val connected = capabilities.hasCapability(NET_CAPABILITY_INTERNET)
Log.d("Net", connected.toString())
}
override fun onLost(network: Network) {
Log.d("Net", "Связь потеряна")
}
}
Для проверки примера можно переключаться между режимами Airplane mode.
Мы подключили слушатель, который следит за доступностью сети.
Если вы хотите отслеживать состояние сети в синхронном режиме, то можно написать так.
button.setOnClickListener {
val connectivityManager = getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager
val capabilities = connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)
val connected = capabilities?.hasCapability(NET_CAPABILITY_INTERNET) == true
Log.d("Net", connected.toString())
}