다음 코드 (Kotlin)는 API 21부터 최신 API 버전 (API 29)까지 작동합니다. getWifiState () 함수는 WiFi 네트워크 상태에 대해 열거 형 클래스에 정의 된 Disable, EnabledNotConnected 및 Connected의 3 가지 값 중 하나를 반환합니다. 이를 통해 사용자에게 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에 추가해야한다는 점에 유의해야합니다 (여기에서는 noobies) .