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

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

(0)

相关推荐

  • Android获取当前手机网络类型(2g、3g、4g、wifi)以及手机型号、版本号代码

    获取手机型号: android.os.Build.MODEL 获取手机的SDK版本号:android.os.Build.VERSION.SDK 获取手机当前网络类型代码如下:这是一个工具类,大家可以保存下来以后方便使用. package com.iqtogether.qxueyou.support.util; import android.content.Context; import android.net.ConnectivityManager; import android.net.Net

  • Android wifi 调试详解及简单实例

    Android wifi 调试 前言: 做android开发的时候,经常遇到的一个问题就是真机调试次数多了,会导致usb口,损坏,而且长期给手机充电也会损坏手机,所以我想了想是否可以拿usb调试,网上找了下,还真可以,但都写的比较繁琐,今天我们就使用3条命令完成任务 首先我们需要使用的工具是adb,它基于tcp协议之上 1.开始我们需要给手机开启tcpip模式,这个时候需要usb线连接手机 adb tcpip 端口号(随便写个大点的比如:5555) 写完这个之后,usb就没用了 2.你需要查看你

  • 在Android里完美实现基站和WIFI定位

    不过其实只要明白了基站/WIFI定位的原理,自己实现基站/WIFI定位其实不难.基站定位一般有几种,第一种是利用手机附近的三个基站进行三角定位,由于每个基站的位置是固定的,利用电磁波在这三个基站间中转所需要时间来算出手机所在的坐标:第二种则是利用获取最近的基站的信息,其中包括基站id,location area code.mobile country code.mobile network code和信号强度,将这些数据发送到google的定位web服务里,就能拿到当前所在的位置信息,误差一般在

  • Android开发之Wifi基础教程

    本文实例讲述了Android开发Wifi的基础知识.分享给大家供大家参考.具体如下: Android提供了WifiManager这个类,通过这个类可以进行wifi相关的各种操作. 通过 wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE) 可获取该类的实例. 1. 获取wifi开启状态 (只要手机的wifi打开了,即认为是开启状态,而与是否连接了某个wifi无关): boolean isOpen = wifiMana

  • android编程实现设置、打开wifi热点共享供他人连接的方法

    本文实例讲述了android编程实现设置.打开wifi热点共享供他人连接的方法.分享给大家供大家参考,具体如下: 用过快牙的朋友应该知道它们在两天设备之间传输文件的时候使用的是wifi热点,然后另一台便连接这个热点再进行传输.快牙传输速度惊人应该跟它的这种机制有关系吧.不知道它的搜索机制是怎样的,但我想应该可以通过热点的名字来进行判断吧.下面我们就来探讨一下如何自动创建一个wifi热点吧 创建wifi热点首先需要手机支持,建议开发的哥们整个好点的手机,我们公司那些个山寨设备,几近有一半是不支持热

  • Android判断wifi是5G还是2.4G

    我一开始看这帖子,找不到答案,为了后来的人,我来回复吧. WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); WifiInfo wifiInfo = wifiManager.getConnectionInfo(); 根据wifiInfo.getFrequency()可以判断是不是5G 应该将会返回4个数字 2字开头的话,就系2.4G:5字开头的话,就系5G. 最好用第一个数字来判断,而不要

  • 通过WIFI(不用数据线)连接Android手机调试

    Android开发中少不了真机调试,总用数据线插插拔拔的还是不方便也不稳定,其实可以实现WIFI的方式连接android手机. 1. 当然首先要打开WIFI,手机要和电脑在同一局域网内. 2. 在手机上安装AdbWireless(Google Play上需搜一下就有),注意手机是需要root过的. 3. 安装完毕后在手机上启动AdbWireless,按屏幕中央的大按钮激活无线连接: 如何通过WIFI连接(不用数据线)Android手机调试 4. 按照屏幕提示,在电脑上从Android SDK\p

  • Android 如何查看Wifi密码

    Android 如何查看Wifi密码 前言: 在Android手机中,连接了Wifi之后,密码一般就看不到了,那有没有什么办法可以查看到这些密码呢?办法一般有两种,一种是通过查看wifi的配置文件,一种是使用命令.对于第一种,网上已经有很多了,大致就是先root,然后使用一些手机助手或者手机文件查看之类的工具(如ES.Root Exploere等)来查看wifi配置文件(位置是进入data/misc/wifi,目录里有个wpa_supplicant.conf或者其他文件名以.conf结尾的文件)

  • Android获取当前已连接的wifi信号强度的方法

    本文实例讲述了Android获取当前已连接的wifi信号强度的方法,是Android程序开发中非常常见的重要技巧.分享给大家供大家参考之用.具体方法如下: 1.得到当前已连接的wifi信息 WifiManager wifi_service = (WifiManager)getSystemService(WIFI_SERVICE); WifiInfo wifiInfo = wifi_service.getConnectionInfo(); 其中wifiInfo有以下的方法: wifiinfo.ge

  • 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(). * * @p

  • 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(). * * @p

  • Android 中读取Excel文件实例详解

    Android 中读取Excel文件实例详解 最近有个需求需要在app内置数据,新来的产品扔给了我两个Excel表格就不管了(两个表格格式还不统一...),于是通过度娘等方法找到了Android中读取Excel表格文件的一种方法,记录一下. 闲话一下Excel中工作簿和工作表的区别: 工作簿中包含有工作表.工作簿可以由一张或多张工作表组成,一个工作簿就是一个EXCEL表格文件. 好了,开始读取表格文件吧. 前提 首先,我们假设需要读取的表格文件名字为test.xls, 位于assets根目录下.

  • Android 控制ScrollView滚动的实例详解

    Android 控制ScrollView滚动的实例详解 在开发中,我们经常需要更新列表,并将列表拉倒最底部,比如发表微博,聊天界面等等, 这里有两种办法,第一种,使用scrollTo(): public static void scrollToBottom(final View scroll, final View inner) { Handler mHandler = new Handler(); mHandler.post(new Runnable() { public void run()

  • Android Adapter里面嵌套ListView实例详解

    Android Adapter里面嵌套ListView实例详解 前言: 可嵌套~但是显示需要特殊处理下~以下是处理方法 前几天因为项目的需要,要在一个ListView中放入另一个ListView,也即在一个ListView的每个ListItem中放入另外一个ListView.但刚开始的时候,会发现放入的小ListView会显示不完全,它的高度始终有问题.上网查了下,发现别人也有遇到这样的问题,而大多数人都不推荐这样的设计,因为默认情况下Android是禁止在ScrollView中放入另外的Scr

  • Android中mvp模式使用实例详解

    MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负 责显示.作为一种新的模式,MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会从直接Model中读取数据而不是通过 Controller. 在MVC里,View是可以直接访问

  • JDBC中resutset接口操作实例详解

    本文主要向大家展示JDBC接口中resutset接口的用法实例,下面我们看看具体内容. 1. ResultSet细节1 功能:封锁结果集数据 操作:如何获得(取出)结果 package com.sjx.a; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import org.junit.Test; //1. next方

  • Angularjs cookie 操作实例详解

    摘要 现在很多app采用内嵌h5的方式进行开发,有些数据会存在webveiw的cookie中,那么如果使用angularjs开发单页应用,就需要用到angularjs的cookie操作.这里提供一个简单的学习demo.方便快速上手. 一个例子 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" ng-app="myapp"> <head> <meta http

  • 数据结构 栈的操作实例详解

    数据结构 栈的操作实例详解 说明: 往前学习数据结构,想运行一个完整的顺序栈的程序都运行不了,因为书上给的都是一部分一部分的算法,并没有提供一个完整可运行的程序,听了实验课,自己折腾了一下,总算可以写一个比较完整的顺序栈操作的小程序,对于栈也慢慢开始有了感觉.下面我会把整个程序拆开来做说明,只要把这些代码放在一个文件中,用编译器就可以直接编译运行了. 一.实现 1.程序功能 关于栈操作的经典程序,首当要提及进制数转换的问题,利用栈的操作,就可以十分快速地完成数的进制转换. 2.预定义.头文件导入

  • Android使用xml自定义图片实例详解

    Android使用xml自定义图片实例详解 实现效果图: 白色圆角图片 bg_round_rectangle_white.xml <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <!-

随机推荐