O código a seguir (no Kotlin) funciona da API 21 até pelo menos a versão atual da API (API 29). A função getWifiState () retorna um dos três valores possíveis para o estado da rede WiFi: Disable, EnabledNotConnected e Connected que foram definidos em uma classe enum. Isso permite tomar decisões mais granulares, como informar o usuário para ativar o Wi-Fi ou, se já estiver ativado, conectar-se a uma das redes disponíveis. Mas se tudo o que for necessário é um booleano indicando se a interface WiFi está conectada a uma rede, a outra função é Wi-FiConnected (). Ele usa o anterior e compara o resultado ao Conectado.
Ele se inspira em algumas das respostas anteriores, mas tenta resolver os problemas introduzidos pela evolução das APIs do Android ou pela crescente disponibilidade do IP V6. O truque era usar:
wifiManager.connectionInfo.bssid != null
ao invés de:
- getIpAddress () == 0 que é válido apenas para IP V4 ou
- getNetworkId () == -1 que agora requer outra permissão especial (Local)
De acordo com a documentação: https://developer.android.com/reference/kotlin/android/net/wifi/WifiInfo.html#getbssid,
ele retornará nulo se não estiver conectado a uma rede. E mesmo se não tivermos permissão para obter o valor real, ele ainda retornará algo diferente de nulo se estivermos conectados.
Lembre-se também do seguinte:
Nas versões anteriores ao android.os.Build.VERSION_CODES # N, esse objeto deve ser obtido apenas em um contexto # getApplicationContext () e não em qualquer outro contexto derivado para evitar vazamentos de memória no processo de chamada.
No manifesto, não esqueça de adicionar:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
O código 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
ao seu AndroidManifest.xml para que isso funcione.