次のコード (Kotlin 内) は、API 21 から少なくとも最新の API バージョン (API 29) まで機能します。関数 getWifiState() は、WiFi ネットワーク状態の 3 つの値のうちの 1 つを返します: Disable、EnabledNotConnected、および Connected は列挙型クラスで定義されています。これにより、WiFi を有効にするようユーザーに通知したり、既に有効になっている場合は利用可能なネットワークの 1 つに接続したりするなど、より詳細な決定を下すことができます。しかし、WiFi インターフェースがネットワークに接続されているかどうかを示すブール値だけが必要な場合は、他の関数 isWifiConnected() がそれを提供します。以前のものを使用し、結果を Connected と比較します。
以前の回答のいくつかに触発されましたが、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)
}
}