Der folgende Code (in Kotlin) funktioniert von API 21 bis mindestens zur aktuellen API-Version (API 29). Die Funktion getWifiState () gibt einen von drei möglichen Werten für den WiFi-Netzwerkstatus zurück: Disable, EnabledNotConnected und Connected, die in einer Enum-Klasse definiert wurden. Dies ermöglicht detailliertere Entscheidungen, z. B. die Information des Benutzers, WLAN zu aktivieren oder, falls bereits aktiviert, eine Verbindung zu einem der verfügbaren Netzwerke herzustellen. Wenn jedoch nur ein Boolescher Wert benötigt wird, der angibt, ob die WiFi-Schnittstelle mit einem Netzwerk verbunden ist, erhalten Sie die andere Funktion isWifiConnected (). Es verwendet das vorherige und vergleicht das Ergebnis mit Connected.
Es ist inspiriert von einigen der vorherigen Antworten, versucht jedoch, die Probleme zu lösen, die durch die Entwicklung der Android-APIs oder die langsam steigende Verfügbarkeit von IP V6 entstehen. Der Trick war zu verwenden:
wifiManager.connectionInfo.bssid != null
anstatt:
- getIpAddress () == 0, die nur für IP V4 oder gültig ist
- getNetworkId () == -1, für das jetzt eine weitere Sonderberechtigung erforderlich ist (Speicherort)
Gemäß der Dokumentation: https://developer.android.com/reference/kotlin/android/net/wifi/WifiInfo.html#getbssid
wird null zurückgegeben, wenn keine Verbindung zu einem Netzwerk besteht. Und selbst wenn wir keine Berechtigung haben, den tatsächlichen Wert abzurufen, wird immer noch etwas anderes als null zurückgegeben, wenn wir verbunden sind.
Beachten Sie auch Folgendes:
Bei Releases vor android.os.Build.VERSION_CODES # N sollte dieses Objekt nur aus einem Context # getApplicationContext () und nicht aus einem anderen abgeleiteten Kontext abgerufen werden, um Speicherverluste innerhalb des aufrufenden Prozesses zu vermeiden.
Vergessen Sie nicht, im Manifest Folgendes hinzuzufügen:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
Vorgeschlagener Code ist:
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
zu Ihrer AndroidManifest.xml hinzufügen müssen, damit dies funktioniert.