当前位置: 移动技术网 > 移动技术>移动开发>Android > Android Wifi的forget()操作实例详解

Android Wifi的forget()操作实例详解

2019年07月24日  | 移动技术网移动技术  | 我要评论
android  wifi的forget()操作实例详解 我们在处理某个wifi连接时,有时会需要忘掉当前连接的密码信息。执行这项操作,我们需要调用wifima

android  wifi的forget()操作实例详解

我们在处理某个wifi连接时,有时会需要忘掉当前连接的密码信息。执行这项操作,我们需要调用wifimanager::forget()函数:

/** 
 * delete the network in the supplicant config. 
 * 
 * this function is used instead of a sequence of removenetwork() 
 * and saveconfiguration(). 
 * 
 * @param config the set of variables that describe the configuration, 
 *      contained in a {@link wificonfiguration} object. 
 * @param listener for callbacks on success or failure. can be null. 
 * @throws illegalstateexception if the wifimanager instance needs to be 
 * initialized again 
 * @hide 
 */ 
public void forget(int netid, actionlistener listener) { 
  if (netid < 0) throw new illegalargumentexception("network id cannot be negative"); 
  validatechannel(); 
  sasyncchannel.sendmessage(forget_network, netid, putlistener(listener)); 
} 

从函数介绍可知,调用forget()函数,当前网络连接的配置信息就会从wpa_supplicant.conf中删掉;之后这个网络就不会有自动重连的动作,因为conf文件中已经没有该网络的配置信息。

跟踪forget_network消息,wifiserviceimpl::clienthandler处理:

case wifimanager.forget_network: 
  if (isowner(msg.sendinguid)) { 
    mwifistatemachine.sendmessage(message.obtain(msg)); 
  } else { 
    slog.e(tag, "forget is not authorized for user"); 
    replyfailed(msg, wifimanager.forget_network_failed, 
        wifimanager.not_authorized); 
  } 
  break; 

简单地将该消息转发给wifistatemachine。此时wifi是连接状态,wifistatemachine中当前状态是connectedstate,它的父状态connectmodestate处理:

case wifimanager.forget_network: 
  // debug only, remember last configuration that was forgotten 
  wificonfiguration toremove 
      = mwificonfigstore.getwificonfiguration(message.arg1); 
  if (toremove == null) { 
    lastforgetconfigurationattempt = null; 
  } else { 
    lastforgetconfigurationattempt = new wificonfiguration(toremove); 
  } 
  // check that the caller owns this network 
  netid = message.arg1; 
 
  if (!mwificonfigstore.canmodifynetwork(message.sendinguid, netid, 
      /* onlyannotate */ false)) { 
    logw("not authorized to forget network " 
       + " 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("failed to forget network"); 
    replytomessage(message, wifimanager.forget_network_failed, 
        wifimanager.error); 
  } 
  break; 

mwificonfigstore.forgetnetwork():

/** 
 * forget the specified network and save config 
 * 
 * @param netid network to forget 
 * @return {@code true} if it succeeds, {@code false} otherwise 
 */ 
boolean forgetnetwork(int netid) { 
  if (shownetworks) locallog("forgetnetwork", netid); 
 
  wificonfiguration config = mconfigurednetworks.get(netid); 
  boolean remove = removeconfigandsendbroadcastifneeded(netid); 
  if (!remove) { 
    //success but we dont want to remove the network from supplicant conf file 
    return true; 
  } 
  if (mwifinative.removenetwork(netid)) { 
    if (config != null && config.ispasspoint()) { 
      writepasspointconfigs(config.fqdn, null); 
    } 
    mwifinative.saveconfig(); 
    writeknownnetworkhistory(true); 
    return true; 
  } else { 
    loge("failed to remove network " + netid); 
    return false; 
  } 
} 

根据传入的当前网络的netid,分别调用wifinative的removenetwork()、saveconfig()方法删除conf文件的配置信息并进行保存;执行完成后,forget()函数结束了。通过代码我们发现,执行forget()函数并不会引起wifistatemachine中状态的切换。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网