收到WIFI_STATE_ENABLED后,WifiInfo SSID会立即为空

时间:2013-01-25 08:12:12

标签: android android-intent android-wifi

当我的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?

2 个答案:

答案 0 :(得分:2)

如果您想获取SSID,

WIFI_STATE_ENABLED不是您要捕获的操作。您可能更感兴趣的是NETWORK_STATE_CHANGED

当手机上的WiFi设备开启时,会发生WIFI_STATE_ENABLED - 此时无需连接任何地方。

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

答案 1 :(得分:1)

我一直在使用SUPPLICANT_CONNECTION_CHANGE_ACTION作为我正在使用的应用程序,并发现在启用Wifi然后连接时它可以正常工作。

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

我只尝试了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传奇,所以我也会尝试。不幸的是,这些都不能在虚拟设备上测试。