2

当我的 BroadcastReceiver 直接接收到 WIFI_STATE_ENABLED 之后,WifiInfo 的 SSID 值为空。但是,当我添加 Thread.Sleep() 800 毫秒时,它会起作用。连接 wifi 和 WifiInfo 对象实际获取信息的事件似乎存在延迟。下面的代码片段有效:

    else if (intent.getAction().equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
        int extraWifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN);
        switch (extraWifiState) {
        case WifiManager.WIFI_STATE_ENABLED:
            // The SSID is null just after connection is established. This
            // event seems over eager.
            try {
                Thread.sleep(800, 0);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            if (!wifiFunctions.connectedToGConnectHotspot()) {
                removeConnectedNotification();
            } else {
                settings.setLastNotificationTime(System.currentTimeMillis());
                notifyUserOfAvailableHotspot(true);
                return;
            }
            break; 

这行得通,但它非常狡猾。如果在某些设备上需要更长的时间怎么办?是否有另一种方法来获取连接的 SSID。我查看了 EXTRA_NETWORK_INFO,但它从 API 级别 14 开始已被弃用,而且似乎也不包含 SSID。是否有另一种方法可以在不引入人工等待的情况下获取 SSID?

4

2 回答 2

2

WIFI_STATE_ENABLED如果您要获取 SSID,则不是您要捕获的操作。您可能更感兴趣的是NETWORK_STATE_CHANGED

WIFI_STATE_ENABLED 发生在手机上的 WiFi 设备打开时——它不一定在那个时候连接到任何地方。

编辑:正如评论中指出的那样,NETWORK_STATE_CHANGED 也会触发许多其他事件。为了严格监控与 WiFi 接入点的连接,SUPPLICANT_CONNECTION_CHANGE_ACTION是正确的监听动作。

于 2013-01-25T08:19:13.033 回答
1

我一直在为我正在开发的应用程序使用 SUPPLICANT_CONNECTION_CHANGE_ACTION,发现它在启用 Wifi 然后连接时效果很好。

问题在于,在 Wifi 保持启用状态时更改 Wifi 网络时似乎永远不会触发它。在这种情况下似乎发生的唯一操作是 NETWORK_STATE_CHANGED(3 次,前 2 次将 WifiInfo 设为空)。

我只尝试了 1 台设备(Galaxy S3 4.1),所以我不知道这有多普遍,但似乎 SUPPLICANT_CONNECTION_CHANGE_ACTION 应该适用于此。另一个警告是我在同一个接入点(2.4 和 5.2)上的 2 个 SSID 之间切换,所以也许 Android 实际上并没有将其视为网络更改。

编辑:使用 Galaxy S3 作为第二个 Wifi 热点,使用运行 CyanogenMod 10 的触摸板进行测试。在 Wifi 保持启用状态时切换 SSID(和接入点)时,SUPPLICANT_CONNECTION_CHANGE_ACTION 不会触发。该事件似乎仅在由于启用 Wifi 而建立连接时发生。这实际上看起来像一个错误 - 我有一个旧的 Android 2.2 Legend ,所以我也会尝试。不幸的是,这些都不能在虚拟设备上测试。

于 2013-04-07T11:16:01.853 回答