我想写一个广播接收器,可以获取wifi是否已连接。但是,我总是得到错误的结果。怎么解决?
class wifiStateReceiver: BroadcastReceiver() {
override fun onReceive(ctx: Context, intent: Intent) {
if(intent.action == WifiManager.NETWORK_STATE_CHANGED_ACTION){
Log.i("TEST", "Wifi Connection: ${isWifiNetworkAvailable(ctx)}")
}
}
private fun isWifiNetworkAvailable(context: Context): Boolean {
val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val network = connectivityManager.activeNetwork ?: return false
val networkCapabilities = connectivityManager.getNetworkCapabilities(network) ?: return false
return networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
} else {
return connectivityManager.activeNetworkInfo?.isConnected ?: false
}
}
}
看来只有打开APP后第一次执行onReceive()才是正确的。然后当 Wifi 打开但没有连接到任何东西时,networkCapability.hasTransport(NetworkCapability.TRANSPORT_WIFI) 仍然返回 true:
Wifi Connect: true
。当手机连接wifi时,返回false。
如何判断手机是否正确连接WiFi?
您也可以像这样使用回调来检查 wifi 是否已连接:
private fun listenNetworkChanges(mContext: Context) {
connectivityManager =
mContext.getSystemService() as ConnectivityManager?
val networkRequest =
NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.build()
networkCallback = object : NetworkCallback() {
override fun onAvailable(network: Network) {
Log.d(TAG, "listenNetworkChanges onAvailable $network")
}
override fun onLost(network: Network) {
Log.d(TAG, "listenNetworkChanges onLost $network")
}
override fun onCapabilitiesChanged(
network: Network,
networkCapabilities: NetworkCapabilities
) {
//do nothing
}
}
connectivityManager?.registerNetworkCallback(networkRequest, networkCallback)
}