รหัสต่อไปนี้ (ใน Kotlin) ทำงานได้จาก API 21 จนถึงรุ่น API ปัจจุบันอย่างน้อย (API 29) ฟังก์ชัน getWifiState () ส่งคืนหนึ่งใน 3 ค่าที่เป็นไปได้สำหรับสถานะเครือข่าย WiFi: ปิดใช้งาน EnabledNotConnected และเชื่อมต่อที่กำหนดไว้ในคลาส enum สิ่งนี้ช่วยให้การตัดสินใจที่ละเอียดยิ่งขึ้นเช่นแจ้งผู้ใช้เพื่อเปิดใช้งาน WiFi หรือหากเปิดใช้งานแล้วเพื่อเชื่อมต่อกับหนึ่งในเครือข่ายที่มีอยู่ แต่ถ้าสิ่งที่จำเป็นทั้งหมดคือบูลีนที่ระบุว่าอินเทอร์เฟซ WiFi เชื่อมต่อกับเครือข่ายแล้วฟังก์ชั่นอื่น ๆ ก็คือ มันใช้ก่อนหน้านี้และเปรียบเทียบผลลัพธ์กับการเชื่อมต่อ
มันเป็นแรงบันดาลใจในคำตอบก่อนหน้านี้บางส่วน แต่พยายามที่จะแก้ปัญหาที่เกิดขึ้นจากวิวัฒนาการของ 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 เพื่อให้ทำงานได้