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中状态的切换。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!