android 原生的WIFI连接模块很复杂。
一,应用开发者面临最难的问题之一就是密码错误或者连接失败(
ERROR_AUTHENTICATING/FAILED)的系统广播在应用层基本上是接收不到的。
1,与之相关的系统广播是下面两个,一个是上报连接之后的额外信息,一个是众所周知的WIFI连接状态改变,
它们的枚举取值分别如下:
WifiManager.SUPPLICANT_STATE_CHANGED_ACTION
public static enum DetailedState { AUTHENTICATING, BLOCKED, CAPTIVE_PORTAL_CHECK, CONNECTED, CONNECTING, DISCONNECTED, DISCONNECTING, FAILED, IDLE, OBTAINING_IPADDR, SCANNING, SUSPENDED, VERIFYING_POOR_LINK; private DetailedState() { } }
WifiManager.NETWORK_STATE_CHANGED_ACTIONpublic static enum State { CONNECTED, CONNECTING, DISCONNECTED, DISCONNECTING, SUSPENDED, UNKNOWN; private State() { }}
2,密码连接失败的判断需要下列代码:
int linkWifiResult = intent.getIntExtra(WifiManager.EXTRA_SUPPLICANT_ERROR, 123);
SupplicantState supplicantState = (SupplicantState) intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE);
NetworkInfo.DetailedState state = WifiInfo.getDetailedStateOf(supplicantState); handleWifiStateChanged(state); if (linkWifiResult == WifiManager.ERROR_AUTHENTICATING) { //此代码是系统提供的密码错误的消息广播 }
3,那么该怎样解决这个问题呢?
经测试,密码正常时网络热点的连接需要的时长大约是 5s-20s之间,于是就可以依赖于超时来做上述问题的解决方案。
当然手机厂商一般会在ROM层面做更详备更富有层次性的处理。
二,随后又碰到了android属性动画与利用handler消息wifi刷新数据的冲突问题。
此问题困扰了一天,最终分析定位到最核心的问题所在之后(定位问题的细节,是这样的:
当触发连接之后,显示连接动画,如果此时屏蔽掉系统WIFI消息的处理,则动画能流畅进行。),
最后采取了显示动画过程中,屏蔽掉系统WIFI消息的处理;动画消失时,再刷新界面。