Il seguente codice (in Kotlin) funziona dall'API 21 fino almeno alla versione API corrente (API 29). La funzione getWifiState () restituisce uno dei 3 possibili valori per lo stato della rete WiFi: Disable, EnabledNotConnected e Connected definiti in una classe enum. Ciò consente di prendere decisioni più dettagliate come informare l'utente per abilitare il WiFi o, se già abilitato, connettersi a una delle reti disponibili. Ma se tutto ciò che serve è un valore booleano che indica se l'interfaccia WiFi è connessa a una rete, allora l'altra funzione isWifiConnected () ti darà questo. Utilizza il precedente e confronta il risultato con Connected.
È ispirato in alcune delle risposte precedenti ma cerca di risolvere i problemi introdotti dall'evoluzione delle API di Android o dalla disponibilità lentamente crescente di IP V6. Il trucco era usare:
wifiManager.connectionInfo.bssid != null
invece di:
- getIpAddress () == 0 valido solo per IP V4 o
- getNetworkId () == -1 che ora richiede un'altra autorizzazione speciale (Posizione)
Secondo la documentazione: https://developer.android.com/reference/kotlin/android/net/wifi/WifiInfo.html#getbssid
restituirà null se non connesso a una rete. E anche se non abbiamo l'autorizzazione per ottenere il valore reale, restituirà comunque qualcosa di diverso da null se siamo connessi.
Tieni anche presente quanto segue:
Nelle versioni precedenti a android.os.Build.VERSION_CODES # N, questo oggetto deve essere ottenuto solo da un contesto # getApplicationContext () e non da qualsiasi altro contesto derivato per evitare perdite di memoria nel processo di chiamata.
Nel Manifest, non dimenticare di aggiungere:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
Il codice proposto è:
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
al tuo AndroidManifest.xml per farlo funzionare.