You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测手机用户在不同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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:21:59