Poniższy kod (w Kotlinie) działa od API 21 do co najmniej bieżącej wersji API (API 29). Funkcja getWifiState () zwraca jedną z 3 możliwych wartości stanu sieci Wi-Fi: Disable, EnabledNotConnected i Connected, które zostały zdefiniowane w klasie enum. Umożliwia to podejmowanie bardziej szczegółowych decyzji, takich jak poinformowanie użytkownika o włączeniu Wi-Fi lub, jeśli jest już włączone, o połączeniu się z jedną z dostępnych sieci. Ale jeśli wszystko, co jest potrzebne, to wartość logiczna wskazująca, czy interfejs WiFi jest podłączony do sieci, wtedy inna funkcja isWifiConnected () da ci to. Wykorzystuje poprzedni i porównuje wynik z połączonym.
Jest inspirowany niektórymi wcześniejszymi odpowiedziami, ale próbuje rozwiązać problemy związane z ewolucją interfejsów API Androida lub powoli rosnącą dostępnością IP V6. Sztuką było użycie:
wifiManager.connectionInfo.bssid != null
zamiast:
- getIpAddress () == 0, który jest poprawny tylko dla IP V4 lub
- getNetworkId () == -1, który wymaga teraz innego specjalnego uprawnienia (lokalizacja)
Zgodnie z dokumentacją: https://developer.android.com/reference/kotlin/android/net/wifi/WifiInfo.html#getbssid
zwróci wartość null, jeśli nie zostanie podłączony do sieci. I nawet jeśli nie mamy pozwolenia na uzyskanie rzeczywistej wartości, nadal będzie zwracać coś innego niż zero, jeśli będziemy połączeni.
Pamiętaj również o następujących kwestiach:
W wersjach wcześniejszych niż android.os.Build.VERSION_CODES # N ten obiekt należy uzyskać tylko z Context # getApplicationContext (), a nie z żadnego innego kontekstu pochodnego, aby uniknąć wycieków pamięci w procesie wywoływania.
W Manifeście nie zapomnij dodać:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
Proponowany kod to:
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
do pliku AndroidManifest.xml, aby to zadziałało.