直接上代码再说明一下,有时一直获取
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 经常是
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变换的监听,但是有两个问题会返回
1、没有使用FLAG_INCLUDE_LOCATION_INFO会获取不到名称,一定要加上,如上面代码ConnectivityManager.NetworkCallback(FLAG_INCLUDE_LOCATION_INFO)。
2、如果在修改wifi时,app退到后台,此时监听会生效,但是名称是