android4.4如何不保存连接验证失败的WiFi热点

来源:互联网 发布:软件开发图片 编辑:程序博客网 时间:2024/06/05 06:44

软件版本:Android4.4

硬件平台:MTK


发现Android4.4的WiFi连接之后,不论密码对或者错误都是会进入到已保存的状态,个人感觉有些不太合理。

我们的产品需求需要添加两种用户提示:其一,超时提醒;其二,密码验证失败提醒。

我这边关于这两种情况的实现是做了toast提示。

密码错误的提示如下:

--- a/vendor/vinci/packages/apps/VinciSettings/src/com/android/settings/wifi/WifiSettings.java
+++ b/vendor/vinci/packages/apps/VinciSettings/src/com/android/settings/wifi/WifiSettings.java

@@ -1219,6 +1236,15 @@ public class WifiSettings extends RestrictedSettingsFragment
///@}
updateAccessPoints();
} else if (WifiManager.SUPPLICANT_STATE_CHANGED_ACTION.equals(action)) {
+ int linkWifiResult = intent.getIntExtra(WifiManager.EXTRA_SUPPLICANT_ERROR, 123);
+ if (linkWifiResult == WifiManager.ERROR_AUTHENTICATING) {
+ mHandler.removeMessages(100);
+ if (mConnectingDialog.isShowing()) {
+ mConnectingDialog.dismiss();
+ CustomToast.makeText(getActivity(), getString(R.string.vinci_wifi_passwd_error), Toast.LENGTH_LONG).show();
+ return;
+ }
+ }

在密码验证失败之后framework中的wpa监听类会发出相应的事件广播EXTRA_SUPPLICANT_ERROR其中密码校验错误码为123,做如上修改即可弹出toast提示相关信息。

至于超时提醒,就需要在用户点击连接按钮之后,就发出一个超时的msg(比如30s后发出),如果进入到连接成功的事件处理逻辑,就把该msg remove掉即可。


下面看连接失败,如何不保存config的问题,4.4的逻辑,只要状态机有接收到连接的状态指令,不论成功与否就会调用保存的接口去保存配置,而连接失败之后,是没有再做删除之类的处理的,因此我来做。。。。。。


--- a/vendor/vinci/packages/apps/VinciSettings/src/com/android/settings/wifi/WifiSettings.java
+++ b/vendor/vinci/packages/apps/VinciSettings/src/com/android/settings/wifi/WifiSettings.java

@@ -1218,6 +1219,15 @@ public class WifiSettings extends RestrictedSettingsFragment
}
}

+ //We do not save the config which authenticating error
+ private void vinciUnsaveSpot() {
+ List<WifiConfiguration> savedConfigs = mWifiManager.getConfiguredNetworks();
+ Xlog.i(TAG, "====== savedConfigs size: " + savedConfigs.size());
+
+ if (null != savedConfigs)
+ mWifiManager.forget((savedConfigs.size() - 1), mForgetListener);
+ }
+

private void handleEvent(Context context, Intent intent) {
if (DBG) Log.d(TAG, "handleEvent(Context context, Intent intent) ");

@@ -1238,6 +1248,7 @@ public class WifiSettings extends RestrictedSettingsFragment
} else if (WifiManager.SUPPLICANT_STATE_CHANGED_ACTION.equals(action)) {
int linkWifiResult = intent.getIntExtra(WifiManager.EXTRA_SUPPLICANT_ERROR, 123);
if (linkWifiResult == WifiManager.ERROR_AUTHENTICATING) {
+ vinciUnsaveSpot();
mHandler.removeMessages(100);
if (mConnectingDialog.isShowing()) {
mConnectingDialog.dismiss();

这是21世纪初,最伟大的发明创造之一,错误WiFi连接不保存!!!


简单说明一下这段看似简单改动的小插曲:

因为wifisettings中对每一个submit的热点都会封装为一个config文件,那么在该文件做一个全局的最近连接的config变量,然后失败了直接删除该config的netID可以吗?

答案是不可以,因为在未经过wifistatemachine保存之前,该config的id是-1,即为invalid状态,是无法删除的。。。

而在经过状态机下发connect命令,然后再保存之后,netID会做一次更新排序,从0开始往后递增,即第一个config的id是0,第二个保存的config的id是1,以此类推。

而最近的保存的一个失败的(不管成功失败)id就是config列表的size-1,因此需要从逻辑上获取configs列表,然后如果连接失败,删除掉最后一个即size-1的config即可。


完成~~~






































阅读全文
0 0