Android Wifi的forget()操作实例详解
Android Wifi的forget()操作实例详解
我们在处理某个Wifi连接时,有时会需要忘掉当前连接的密码信息。执行这项操作,我们需要调用WifiManager::forget()函数:
/** *Deletethenetworkinthesupplicantconfig. * *ThisfunctionisusedinsteadofasequenceofremoveNetwork() *andsaveConfiguration(). * *@paramconfigthesetofvariablesthatdescribetheconfiguration, *containedina{@linkWifiConfiguration}object. *@paramlistenerforcallbacksonsuccessorfailure.Canbenull. *@throwsIllegalStateExceptioniftheWifiManagerinstanceneedstobe *initializedagain *@hide */ publicvoidforget(intnetId,ActionListenerlistener){ if(netId<0)thrownewIllegalArgumentException("Networkidcannotbenegative"); validateChannel(); sAsyncChannel.sendMessage(FORGET_NETWORK,netId,putListener(listener)); }
从函数介绍可知,调用forget()函数,当前网络连接的配置信息就会从wpa_supplicant.conf中删掉;之后这个网络就不会有自动重连的动作,因为conf文件中已经没有该网络的配置信息。
跟踪FORGET_NETWORK消息,WifiServiceImpl::ClientHandler处理:
caseWifiManager.FORGET_NETWORK: if(isOwner(msg.sendingUid)){ mWifiStateMachine.sendMessage(Message.obtain(msg)); }else{ Slog.e(TAG,"Forgetisnotauthorizedforuser"); replyFailed(msg,WifiManager.FORGET_NETWORK_FAILED, WifiManager.NOT_AUTHORIZED); } break;
简单地将该消息转发给WifiStateMachine。此时Wifi是连接状态,WifiStateMachine中当前状态是ConnectedState,它的父状态ConnectModeState处理:
caseWifiManager.FORGET_NETWORK: //Debugonly,rememberlastconfigurationthatwasforgotten WifiConfigurationtoRemove =mWifiConfigStore.getWifiConfiguration(message.arg1); if(toRemove==null){ lastForgetConfigurationAttempt=null; }else{ lastForgetConfigurationAttempt=newWifiConfiguration(toRemove); } //checkthatthecallerownsthisnetwork netId=message.arg1; if(!mWifiConfigStore.canModifyNetwork(message.sendingUid,netId, /*onlyAnnotate*/false)){ logw("Notauthorizedtoforgetnetwork" +"cnid="+netId +"uid="+message.sendingUid); replyToMessage(message,WifiManager.FORGET_NETWORK_FAILED, WifiManager.NOT_AUTHORIZED); break; } if(mWifiConfigStore.forgetNetwork(message.arg1)){ replyToMessage(message,WifiManager.FORGET_NETWORK_SUCCEEDED); broadcastWifiCredentialChanged(WifiManager.WIFI_CREDENTIAL_FORGOT, (WifiConfiguration)message.obj); }else{ loge("Failedtoforgetnetwork"); replyToMessage(message,WifiManager.FORGET_NETWORK_FAILED, WifiManager.ERROR); } break;
mWifiConfigStore.forgetNetwork():
/** *Forgetthespecifiednetworkandsaveconfig * *@paramnetIdnetworktoforget *@return{@codetrue}ifitsucceeds,{@codefalse}otherwise */ booleanforgetNetwork(intnetId){ if(showNetworks)localLog("forgetNetwork",netId); WifiConfigurationconfig=mConfiguredNetworks.get(netId); booleanremove=removeConfigAndSendBroadcastIfNeeded(netId); if(!remove){ //successbutwedontwanttoremovethenetworkfromsupplicantconffile returntrue; } if(mWifiNative.removeNetwork(netId)){ if(config!=null&&config.isPasspoint()){ writePasspointConfigs(config.FQDN,null); } mWifiNative.saveConfig(); writeKnownNetworkHistory(true); returntrue; }else{ loge("Failedtoremovenetwork"+netId); returnfalse; } }
根据传入的当前网络的netId,分别调用WifiNative的removeNetwork()、saveConfig()方法删除conf文件的配置信息并进行保存;执行完成后,forget()函数结束了。通过代码我们发现,执行forget()函数并不会引起WifiStateMachine中状态的切换。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!