Kode berikut (dalam Kotlin) berfungsi dari API 21 hingga setidaknya versi API saat ini (API 29). Fungsi getWifiState () mengembalikan salah satu dari 3 nilai yang mungkin untuk status jaringan WiFi: Disable, EnabledNotConnected, dan Connected yang didefinisikan dalam kelas enum. Ini memungkinkan untuk mengambil keputusan yang lebih rinci seperti memberi tahu pengguna untuk mengaktifkan WiFi atau, jika sudah diaktifkan, untuk terhubung ke salah satu jaringan yang tersedia. Tetapi jika semua yang diperlukan adalah boolean yang menunjukkan jika antarmuka WiFi terhubung ke jaringan, maka fungsi lainnya adalahWifiConnected () akan memberi Anda itu. Ini menggunakan yang sebelumnya dan membandingkan hasilnya dengan Connected.
Ini terinspirasi dalam beberapa jawaban sebelumnya tetapi mencoba untuk memecahkan masalah yang diperkenalkan oleh evolusi Android API atau ketersediaan IP V6 yang perlahan meningkat. Triknya adalah menggunakan:
wifiManager.connectionInfo.bssid != null
dari pada:
- getIpAddress () == 0 yang hanya berlaku untuk IP V4 atau
- getNetworkId () == -1 yang sekarang memerlukan izin khusus lain (Lokasi)
Menurut dokumentasi: https://developer.android.com/reference/kotlin/android/net/wifi/WifiInfo.html#getbssid
itu akan mengembalikan nol jika tidak terhubung ke jaringan. Dan bahkan jika kita tidak memiliki izin untuk mendapatkan nilai sebenarnya, masih akan mengembalikan sesuatu selain nol jika kita terhubung.
Juga perhatikan hal berikut:
Pada rilis sebelum android.os.Build.VERSION_CODES # N, objek ini hanya dapat diperoleh dari Konteks # getApplicationContext (), dan bukan dari konteks turunan lainnya untuk menghindari kebocoran memori dalam proses pemanggilan.
Dalam Manifest, jangan lupa untuk menambahkan:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
Kode yang diusulkan adalah:
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 Anda agar ini berfungsi.