当我的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?
答案 0 :(得分:2)
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传奇,所以我也会尝试。不幸的是,这些都不能在虚拟设备上测试。