Наступний код (у Котліні) працює від API 21 до принаймні поточної версії API (API 29). Функція getWifiState () повертає одне з 3 можливих значень для стану мережі WiFi: Вимкнути, Увімкнено, Не З'єднано та З'єднано, які були визначені у перерахунку класу. Це дозволяє приймати більш детальні рішення, такі як інформування користувача про включення Wi-Fi або, якщо це вже ввімкнено, підключення до однієї з доступних мереж. Але якщо все, що потрібно, - це булеве вказівка того, що WiFi-інтерфейс підключений до мережі, то інша функція isWifiConnected () дасть вам це. Він використовує попередній і порівнює результат з підключеним.
Це надихається в деяких попередніх відповідях, але намагається вирішити проблеми, пов'язані з еволюцією API Android або повільно зростаючою доступністю 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 цей об'єкт повинен бути отриманий тільки з контексту # 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.