全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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中状态的切换。

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


# Android  # Wifi的forget()操作  # Wifi的forget()操作详解  # Wifi  # forget()  # Android wifi 调试详解及简单实例  # Android 如何查看Wifi密码  # Android判断wifi是5G还是2.4G  # 通过WIFI(不用数据线)连接Android手机调试  # Android获取当前手机网络类型(2g、3g、4g、wifi)以及手机型号、版本号代码  # android编程实现设置、打开wifi热点共享供他人连接的方法  # Android开发之Wifi基础教程  # Android获取当前已连接的wifi信号强度的方法  # 在Android里完美实现基站和WIFI定位  # 就会  # 希望能  # 谢谢大家  # 有时会  # 将该  # 就不会有  # 转发给  # 结束了  # 完成后  # ActionListener  # netId  # lt  # IllegalArgumentException  # throw  # Network  # instance  # initialized  # throws  # IllegalStateException  # void 


相关文章: 兔展官网 在线制作,怎样制作微信请帖?  制作网站的软件免费下载,免费制作app哪个平台好?  建站主机是否等同于虚拟主机?  宿州网站制作公司兴策,安徽省低保查询网站?  宝塔新建站点为何无法访问?如何排查?  已有域名和空间如何搭建网站?  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  如何快速搭建个人网站并优化SEO?  定制建站方案优化指南:企业官网开发与建站费用解析  b2c电商网站制作流程,b2c水平综合的电商平台?  如何访问已购建站主机并解决登录问题?  建站主机数据库如何配置才能提升网站性能?  C++如何使用std::optional?(处理可选值)  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  Bpmn 2.0的XML文件怎么画流程图  如何在Windows环境下新建FTP站点并设置权限?  建站之星展会模版如何一键下载生成?  专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?  在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?  教程网站设计制作软件,怎么创建自己的一个网站?  如何在腾讯云服务器上快速搭建个人网站?  如何选择高性价比服务器搭建个人网站?  如何设置并定期更换建站之星安全管理员密码?  如何快速生成可下载的建站源码工具?  娃派WAP自助建站:免费模板+移动优化,快速打造专业网站  建站之星如何优化SEO以实现高效排名?  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  如何用5美元大硬盘VPS安全高效搭建个人网站?  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  XML的“混合内容”是什么 怎么用DTD或XSD定义  Python多线程使用规范_线程安全解析【教程】  企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?  如何选择域名并搭建高效网站?  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  在线制作视频的网站有哪些,电脑如何制作视频短片?  微课制作网站有哪些,微课网怎么进?  攀枝花网站建设,攀枝花营业执照网上怎么年审?  网站制作网站,深圳做网站哪家比较好?  制作网站的基本流程,设计网站的软件是什么?  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?  制作农业网站的软件,比较好的农业网站推荐一下?  ,网站推广常用方法?  广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?  营销式网站制作方案,销售哪个网站招聘效果最好?  ,石家庄四十八中学官网?  建站之星免费版是否永久可用?  整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。