直接上代码再说明一下,有时一直获取<unknown ssid>的问题,

fun startWifiListener(){
        if(isRunningWifiChangeListener){
            return
        }
        isRunningWifiChangeListener = true
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { //android12以上监听修改wifi
            val request = NetworkRequest.Builder()
                .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
                .build()
            val connectivityManager = this.applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
            val networkCallback = object : ConnectivityManager.NetworkCallback(FLAG_INCLUDE_LOCATION_INFO) {
                    override fun onCapabilitiesChanged(
                        network: Network,
                        networkCapabilities: NetworkCapabilities
                    ) {
                        val wifiInfo = networkCapabilities.transportInfo as WifiInfo
                        val ssid = WifiSupport.getWifiName(wifiInfo.ssid)
                        Log.e(TAG,"initListener Changed ssid: ${ssid}")// android13 ssid 经常是<unknow ssid>
                        if (BeehiveContact.BEEHIVE_HOTSPOT == ssid) {
                            //wifi连接到指定名称后的操作 dosomething()
                            isRunningWifiChangeListener = false
                        }
                        super.onCapabilitiesChanged(network, networkCapabilities)
                        connectivityManager.unregisterNetworkCallback(this)
                    }
                }
            doAsync {
                while (isRunningWifiChangeListener) {
                    connectivityManager.registerNetworkCallback(request, networkCallback)
                    Thread.sleep(10000)
                }
            }
        }
        else { //android12以下定时获取当前wifi信息
            doAsync{
                while (isRunningWifiChangeListener){
                    var ssid = WifiSupport.getConnectionInfo(this@RestartBeehiveActivity2).ssid
                    ssid = WifiSupport.getWifiName(ssid)
                    Log.e(TAG, "initListener while: ${ssid}" )
                    if(BeehiveContact.BEEHIVE_HOTSPOT == ssid){
                        uiThread {
                            //wifi连接到指定名称后的操作 dosomething()
                        }
                        isRunningWifiChangeListener = false
                    }else {
                        Thread.sleep(10000)
                    }
                }
            }
        }
    }
/**
         * Build.VERSION_CODES.S以前
         */
        fun getConnectionInfo(context: Context): WifiInfo{
            val wifimanager = context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
            return wifimanager.connectionInfo
        }
/**
     * 从跳转页面,返回结果,监听
     */
    private val requestDataLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
        mContext?.let {
            (it as RestartBeehiveActivity2).startWifiListener()
        }
    }

android12以前用,wifimanager.getConnectionInfo(), android12以后用注册wifi变换的监听,但是有两个问题会返回<unknown ssid>

1、没有使用FLAG_INCLUDE_LOCATION_INFO会获取不到名称,一定要加上,如上面代码ConnectivityManager.NetworkCallback(FLAG_INCLUDE_LOCATION_INFO)。

2、如果在修改wifi时,app退到后台,此时监听会生效,但是名称是<unknown ssid>,所以在需要app退到后台这种情况下,可以在返回app后再注册监听,这里返回当前wifi信息名称就对了。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐