Le code suivant (dans Kotlin) fonctionne de l'API 21 jusqu'à au moins la version actuelle de l'API (API 29). La fonction getWifiState () renvoie l'une des 3 valeurs possibles pour l'état du réseau WiFi: Disable, EnabledNotConnected et Connected qui ont été définies dans une classe enum. Cela permet de prendre des décisions plus granulaires comme informer l'utilisateur d'activer le WiFi ou, s'il est déjà activé, de se connecter à l'un des réseaux disponibles. Mais si tout ce qui est nécessaire est un booléen indiquant si l'interface WiFi est connectée à un réseau, alors l'autre fonction isWifiConnected () vous le donnera. Il utilise le précédent et compare le résultat à Connecté.
Il s'inspire de certaines des réponses précédentes mais essaie de résoudre les problèmes introduits par l'évolution des API Android ou la disponibilité lentement croissante d'IP V6. L'astuce consistait à utiliser:
wifiManager.connectionInfo.bssid != null
au lieu de:
- getIpAddress () == 0 qui n'est valide que pour IP V4 ou
- getNetworkId () == -1 qui nécessite désormais une autre autorisation spéciale (Location)
Selon la documentation: https://developer.android.com/reference/kotlin/android/net/wifi/WifiInfo.html#getbssid,
il retournera null s'il n'est pas connecté à un réseau. Et même si nous n'avons pas la permission d'obtenir la valeur réelle, cela retournera toujours quelque chose d'autre que null si nous sommes connectés.
Gardez également à l'esprit les points suivants:
Sur les versions antérieures à android.os.Build.VERSION_CODES # N, cet objet ne doit être obtenu qu'à partir d'un contexte # getApplicationContext (), et non à partir d'un autre contexte dérivé pour éviter les fuites de mémoire dans le processus appelant.
Dans le manifeste, n'oubliez pas d'ajouter:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
Le code proposé est:
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
à votre AndroidManifest.xml pour que cela fonctionne.