Aşağıdaki kod (Kotlin'de) API 21'den en azından güncel API sürümüne (API 29) kadar çalışır. GetWifiState () işlevi, WiFi ağ durumu için 3 olası değerden birini döndürür: Enum sınıfında tanımlanan Disable, EnabledNotConnected ve Connected. Bu, kullanıcıyı WiFi'yi etkinleştirmesini veya zaten etkinleştirildiyse kullanılabilir ağlardan birine bağlanmasını bildirmek gibi daha ayrıntılı kararlar alınmasına olanak tanır. Ancak tüm gereken, WiFi arayüzünün bir ağa bağlı olup olmadığını gösteren bir boolean ise, diğer işlev isWifiConnected () size bunu verecektir. Bir öncekini kullanır ve sonucu Connected ile karşılaştırır.
Önceki yanıtlardan bazılarından ilham aldı, ancak Android API'lerinin evriminin veya IP V6'nın yavaş yavaş kullanılabilirliğinin getirdiği sorunları çözmeye çalışıyor. Hüner kullanmaktı:
wifiManager.connectionInfo.bssid != null
onun yerine:
- getIpAddress () == 0, yalnızca IP V4 veya
- Şimdi başka bir özel izin gerektiren getNetworkId () == -1 (Konum)
Belgelere göre: https://developer.android.com/reference/kotlin/android/net/wifi/WifiInfo.html#getbssid
bir ağa bağlı değilse null değerini döndürür. Ve gerçek değeri elde etme iznimiz olmasa bile, bağlandığımızda yine de null dışında bir şey döndürür.
Ayrıca aşağıdakileri aklınızda bulundurun:
Android.os.Build.VERSION_CODES # N öncesi sürümlerde, bu nesne çağıran süreçte bellek sızıntılarını önlemek için herhangi bir türetilmiş bağlamdan değil, yalnızca Context # getApplicationContext () öğesinden alınmalıdır.
Manifest'te eklemeyi unutmayın:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
Önerilen kod:
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ışması için AndroidManifest.xml dosyasına eklemeniz gerektiği (burada bizim için noobies) belirtilmelidir .