android获取wifi名称

文章描述了在Android系统中,特别是在Android12及以上版本,监听WiFi连接变化时遇到的问题。当切换WiFi或应用退到后台时,可能会收到<unknownssid>。解决方法包括使用FLAG_INCLUDE_LOCATION_INFO标志和在重新进入应用时注册监听。此外,对于不同Android版本,使用不同的API(如wifimanager.getConnectionInfo()或网络监听回调)来获取WiFi信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接上代码再说明一下,有时一直获取<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信息名称就对了。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值