以下代码(在Kotlin中)从API 21开始运行,直到至少是当前的API版本(API 29)。函数getWifiState()返回WiFi网络状态的三个可能值之一:禁用,EnabledNotConnected和Connected,这些值在枚举类中定义。这允许做出更精细的决定,例如通知用户启用WiFi或(如果已启用)连接到可用网络之一。但是,如果仅需要一个布尔值即可指示WiFi接口是否已连接到网络,则另一个函数isWifiConnected()会为您提供。它使用上一个,并将结果与“已连接”进行比较。
它的灵感来自先前的一些答案,但它试图解决由于Android API的演进或IP V6的可用性逐渐提高而引入的问题。诀窍是使用:
wifiManager.connectionInfo.bssid != null
代替:
- getIpAddress()== 0仅对IP V4或
- getNetworkId()== -1现在需要另一个特殊权限(位置)
根据文档:https : //developer.android.com/reference/kotlin/android/net/wifi/WifiInfo.html#getbssid
,如果未连接到网络,它将返回null。即使我们没有获得真实值的权限,但如果我们连接后,它仍会返回null以外的值。
另外请注意以下几点:
在android.os.Build.VERSION_CODES#N之前的版本中,此对象只能从Context#getApplicationContext()获取,而不能从任何其他派生上下文获取,以避免调用过程中发生内存泄漏。
在清单中,不要忘记添加:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
建议的代码是:
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
到AndroidManifest.xml中才能起作用。