如何检测手机用户在不同WiFi网络间切换?
解决WiFi网络切换检测的方案
嘿,我来帮你搞定这个WiFi切换检测的问题!你提到的那个方案只能检测WiFi连接建立,确实没法覆盖网络切换的场景,咱们可以通过跟踪当前连接的SSID结合系统广播来完美解决。
核心思路
我们需要同时监听WiFi状态变化和网络连接状态变化的广播,维护一个全局变量记录当前已连接的SSID,每次收到广播时对比新的SSID与旧值:如果两者不同,就判定为发生了WiFi网络切换。
具体实现步骤
1. 添加必要权限
在AndroidManifest.xml中添加以下权限,确保能获取WiFi状态和网络信息:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- Android 12及以上版本必须添加位置权限才能获取SSID --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
2. 创建WiFi切换检测广播接收器
这个接收器会负责监听广播、对比SSID并触发切换逻辑:
class WifiSwitchReceiver : BroadcastReceiver() { // 存储当前已连接的WiFi SSID private var currentConnectedSsid: String? = null override fun onReceive(context: Context?, intent: Intent?) { val wifiManager = context?.getSystemService(Context.WIFI_SERVICE) as WifiManager val connectionInfo = wifiManager.connectionInfo // 处理SSID可能被双引号包裹的情况 val currentSsid = connectionInfo.ssid?.removeSurrounding("\"") when (intent?.action) { // 监听WiFi状态变化(开启/关闭/连接中/已连接) WifiManager.WIFI_STATE_CHANGED_ACTION, // 监听网络连接状态变化 ConnectivityManager.CONNECTIVITY_ACTION -> { // 检查当前是否处于已连接WiFi的状态 if (connectionInfo.networkId != -1 && currentSsid != null) { // 对比新旧SSID,判断是否发生切换 if (currentConnectedSsid != null && currentConnectedSsid != currentSsid) { // 这里就是WiFi切换的触发逻辑,你可以替换成自己的业务代码 Log.d("WifiSwitchDetector", "WiFi已切换:从 ${currentConnectedSsid} 到 ${currentSsid}") } // 更新当前SSID记录 currentConnectedSsid = currentSsid } else { // WiFi断开连接,重置当前SSID记录 currentConnectedSsid = null } } } } }
3. 动态注册广播接收器
由于Android 8.0及以上对静态广播接收器做了限制,建议在Activity或Service中动态注册:
class MainActivity : AppCompatActivity() { private lateinit var wifiSwitchReceiver: WifiSwitchReceiver override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 初始化接收器并注册广播 wifiSwitchReceiver = WifiSwitchReceiver() val intentFilter = IntentFilter().apply { addAction(WifiManager.WIFI_STATE_CHANGED_ACTION) addAction(ConnectivityManager.CONNECTIVITY_ACTION) } registerReceiver(wifiSwitchReceiver, intentFilter) } override fun onDestroy() { super.onDestroy() // 页面销毁时注销接收器,避免内存泄漏 unregisterReceiver(wifiSwitchReceiver) } }
注意事项
- Android 12+权限处理:要获取SSID必须申请
ACCESS_FINE_LOCATION权限,记得在代码中添加权限申请逻辑,引导用户授权。 - SSID格式处理:系统返回的SSID可能带有双引号,需要用
removeSurrounding("\"")去除,避免对比出错。 - 避免误触发:只有当新旧SSID不同且当前处于已连接状态时才判定为切换,不会因为WiFi断开重连同一个网络而误触发。
内容的提问来源于stack exchange,提问作者Serg Burlaka
相关产品推荐
相关产品推荐

