Đoạn mã sau (trong Kotlin) hoạt động từ API 21 cho đến ít nhất là phiên bản API hiện tại (API 29). Hàm getWifiState () trả về một trong 3 giá trị có thể cho trạng thái mạng WiFi: Vô hiệu hóa, EnablesNotConnected và Connected được xác định trong một lớp enum. Điều này cho phép đưa ra các quyết định chi tiết hơn như thông báo cho người dùng kích hoạt WiFi hoặc, nếu đã được bật, để kết nối với một trong các mạng có sẵn. Nhưng nếu tất cả những gì cần thiết là một boolean cho biết nếu giao diện WiFi được kết nối với mạng, thì chức năng khác làWifiConnected () sẽ cung cấp cho bạn điều đó. Nó sử dụng cái trước đó và so sánh kết quả với Connected.
Nó lấy cảm hứng từ một số câu trả lời trước nhưng cố gắng giải quyết các vấn đề do sự phát triển của API Android hoặc tính sẵn có của IP V6 tăng chậm. Bí quyết là sử dụng:
wifiManager.connectionInfo.bssid != null
thay vì:
- getIpAddress () == 0 chỉ hợp lệ cho IP V4 hoặc
- getNetworkId () == -1 hiện cần một sự cho phép đặc biệt khác (Vị trí)
Theo tài liệu: https://developer.android.com/reference/kotlin/android/net/wifi/WifiInfo.html#getbssid,
nó sẽ trả về null nếu không được kết nối với mạng. Và ngay cả khi chúng tôi không có quyền nhận được giá trị thực, nó vẫn sẽ trả về một thứ khác ngoài null nếu chúng tôi được kết nối.
Cũng có những điều sau đây trong tâm trí:
Khi phát hành trước android.os.Build.VERSION_CODES # N, đối tượng này chỉ nên được lấy từ Ngữ cảnh # getApplicationContext () chứ không phải từ bất kỳ bối cảnh dẫn xuất nào khác để tránh rò rỉ bộ nhớ trong quá trình gọi.
Trong Bản kê khai, đừng quên thêm:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
Mã đề xuất là:
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
vào AndroidManifest.xml để làm việc này.