El siguiente código (en Kotlin) funciona desde API 21 hasta al menos la versión API actual (API 29). La función getWifiState () devuelve uno de los 3 valores posibles para el estado de la red WiFi: Disable, EnabledNotConnected y Connected que se definieron en una clase enum. Esto permite tomar decisiones más detalladas, como informar al usuario que habilite WiFi o, si ya está habilitado, conectarse a una de las redes disponibles. Pero si todo lo que se necesita es un valor booleano que indique si la interfaz WiFi está conectada a una red, entonces la otra función esWifiConnected () le dará eso. Utiliza el anterior y compara el resultado con Connected.
Está inspirado en algunas de las respuestas anteriores, pero trata de resolver los problemas introducidos por la evolución de las API de Android o la disponibilidad cada vez mayor de IP V6. El truco era usar:
wifiManager.connectionInfo.bssid != null
en vez de:
- getIpAddress () == 0 que solo es válido para IP V4 o
- getNetworkId () == -1 que ahora requiere otro permiso especial (Ubicación)
De acuerdo con la documentación: https://developer.android.com/reference/kotlin/android/net/wifi/WifiInfo.html#getbssid
devolverá nulo si no está conectado a una red. E incluso si no tenemos permiso para obtener el valor real, aún devolverá algo más que nulo si estamos conectados.
También tenga en cuenta lo siguiente:
En las versiones anteriores a android.os.Build.VERSION_CODES # N, este objeto solo debe obtenerse de un Context # getApplicationContext (), y no de ningún otro contexto derivado para evitar pérdidas de memoria dentro del proceso de llamada.
En el Manifiesto, no olvides agregar:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
El código propuesto es:
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
a su AndroidManifest.xml para que esto funcione.