次のコード(Kotlin内)は、API 21から少なくとも現在のAPIバージョン(API 29)まで機能します。関数getWifiState()は、列挙型クラスで定義された、Disable、EnabledNotConnected、およびConnectedの3つのWiFiネットワーク状態の可能な値の1つを返します。これにより、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)
}
}
android.permission.ACCESS_NETWORK_STATE
せるには、AndroidManifest.xml に追加する必要があることに注意してください(ここでは、私たちの初心者向けです) 。