Android 9 上通过 ConnectivityManager 获取的连接状态不正确

问题描述 投票:0回答:1

我想写一个广播接收器,可以获取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?

android wifi android-connectivitymanager
1个回答
0
投票

您也可以像这样使用回调来检查 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)
    }
© www.soinside.com 2019 - 2024. All rights reserved.