Следующий код (в Kotlin) работает от API 21 до как минимум текущей версии API (API 29). Функция getWifiState () возвращает одно из 3 возможных значений состояния сети WiFi: Disable, EnabledNotConnected и Connected, которые были определены в классе enum. Это позволяет принимать более детальные решения, такие как информирование пользователя о включении Wi-Fi или, если оно уже включено, подключения к одной из доступных сетей. Но если все, что нужно, это логическое значение, указывающее, подключен ли интерфейс WiFi к сети, тогда другая функция - Wi-FiConnected () даст вам это. Он использует предыдущий и сравнивает результат с подключенным.
Он вдохновлен некоторыми из предыдущих ответов, но пытается решить проблемы, возникающие в связи с эволюцией Android API или медленно растущей доступностью IP V6. Хитрость заключалась в использовании:
wifiManager.connectionInfo.bssid != null
вместо того:
- getIpAddress () == 0, который действителен только для IP V4 или
- getNetworkId () == -1, который теперь требует другого специального разрешения (Местоположение)
Согласно документации: https://developer.android.com/reference/kotlin/android/net/wifi/WifiInfo.html#getbssid
он вернет ноль, если не подключен к сети. И даже если у нас нет разрешения на получение реального значения, оно все равно будет возвращать что-то отличное от нуля, если мы подключены.
Также имейте в виду следующее:
В выпусках до android.os.Build.VERSION_CODES # N этот объект следует получать только из Context # getApplicationContext (), а не из любого другого производного контекста, чтобы избежать утечек памяти в вызывающем процессе.
В Манифесте не забудьте добавить:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
Предлагаемый код:
class MyViewModel(application: Application) : AndroidViewModel(application) {
// Get application context
private val myAppContext: Context = getApplication<Application>().applicationContext
// Define the different possible states for the WiFi Connection
internal enum class WifiState {
Disabled, // WiFi is not enabled
EnabledNotConnected, // WiFi is enabled but we are not connected to any WiFi network
Connected, // Connected to a WiFi network
}
// Get the current state of the WiFi network
private fun getWifiState() : WifiState {
val wifiManager : WifiManager = myAppContext.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
return if (wifiManager.isWifiEnabled) {
if (wifiManager.connectionInfo.bssid != null)
WifiState.Connected
else
WifiState.EnabledNotConnected
} else {
WifiState.Disabled
}
}
// Returns true if we are connected to a WiFi network
private fun isWiFiConnected() : Boolean {
return (getWifiState() == WifiState.Connected)
}
}
android.permission.ACCESS_NETWORK_STATE
в ваш AndroidManifest.xml, чтобы это работало.