Android Settings 出现重复的WIFI SSID,多个相同的WIFI SSID,解决方法,删除之:wifiManager.removeNetwork(existingConfig.networkId);

转载:http://blog.csdn.net/yuanbohx/article/details/8109042

近在做一个项目,其中涉及到一块“自动连接已存在的wifi热点”的功能,在网上查阅了大量资料,五花八门,但其中一些说的很简单,即不能实现傻瓜式的拿来就用,有些说的很详细,但其中不乏些许错误造成功能无法实现,经过浣熊多方努力,终于成功将功能实现,遂将一点点小成就拿出来与大家分享。

在这篇文章中,作者定义了一个wifi工具类,其中存在着操作wifi的各种方法,其中有一些错误我以改正,正确的代码如下(创建一个名为WifiAdmin.Java的文件,以下代码中没有包声明和import,请自行添加):

publicclassWifiAdmin {

// 定义WifiManager对象

privateWifiManager mWifiManager;

// 定义WifiInfo对象

privateWifiInfo mWifiInfo;

// 扫描出的网络连接列表

privateList mWifiList;

// 网络连接列表

privateList mWifiConfiguration;

// 定义一个WifiLock

WifiLock mWifiLock;

// 构造器

publicWifiAdmin(Context context) {

// 取得WifiManager对象

mWifiManager = (WifiManager) context

.getSystemService(Context.WIFI_SERVICE);

// 取得WifiInfo对象

mWifiInfo = mWifiManager.getConnectionInfo();

}

// 打开WIFI

publicvoidopenWifi() {

if(!mWifiManager.isWifiEnabled()) {

mWifiManager.setWifiEnabled(true);

}

}

// 关闭WIFI

publicvoidcloseWifi() {

if(mWifiManager.isWifiEnabled()) {

mWifiManager.setWifiEnabled(false);

}

}

// 检查当前WIFI状态

publicintcheckState() {

returnmWifiManager.getWifiState();

}

// 锁定WifiLock

publicvoidacquireWifiLock() {

mWifiLock.acquire();

}

// 解锁WifiLock

publicvoidreleaseWifiLock() {

// 判断时候锁定

if(mWifiLock.isHeld()) {

mWifiLock.acquire();

}

}

// 创建一个WifiLock

publicvoidcreatWifiLock() {

mWifiLock = mWifiManager.createWifiLock("Test");

}

// 得到配置好的网络

publicList getConfiguration() {

returnmWifiConfiguration;

}

// 指定配置好的网络进行连接

publicvoidconnectConfiguration(intindex) {

// 索引大于配置好的网络索引返回

if(index > mWifiConfiguration.size()) {

return;

}

// 连接配置好的指定ID的网络

mWifiManager.enableNetwork(mWifiConfiguration.get(index).networkId,

true);

}

publicvoidstartScan() {

mWifiManager.startScan();

// 得到扫描结果

mWifiList = mWifiManager.getScanResults();

// 得到配置好的网络连接

mWifiConfiguration = mWifiManager.getConfiguredNetworks();

}

// 得到网络列表

publicList getWifiList() {

returnmWifiList;

}

// 查看扫描结果

publicStringBuilder lookUpScan() {

StringBuilder stringBuilder = newStringBuilder();

for(inti =0; i

stringBuilder

.append("Index_"+newInteger(i +1).toString() +":");

// 将ScanResult信息转换成一个字符串包

// 其中把包括:BSSID、SSID、capabilities、frequency、level

stringBuilder.append((mWifiList.get(i)).toString());

stringBuilder.append("/n");

}

returnstringBuilder;

}

// 得到MAC地址

publicString getMacAddress() {

return(mWifiInfo ==null) ?"NULL": mWifiInfo.getMacAddress();

}

// 得到接入点的BSSID

publicString getBSSID() {

return(mWifiInfo ==null) ?"NULL": mWifiInfo.getBSSID();

}

// 得到IP地址

publicintgetIPAddress() {

return(mWifiInfo ==null) ?0: mWifiInfo.getIpAddress();

}

// 得到连接的ID

publicintgetNetworkId() {

return(mWifiInfo ==null) ?0: mWifiInfo.getNetworkId();

}

// 得到WifiInfo的所有信息包

publicString getWifiInfo() {

return(mWifiInfo ==null) ?"NULL": mWifiInfo.toString();

}

// 添加一个网络并连接

publicvoidaddNetwork(WifiConfiguration wcg) {

intwcgID = mWifiManager.addNetwork(wcg);

booleanb =  mWifiManager.enableNetwork(wcgID,true);

System.out.println("a--"+ wcgID);

System.out.println("b--"+ b);

}

// 断开指定ID的网络

publicvoiddisconnectWifi(intnetId) {

mWifiManager.disableNetwork(netId);

mWifiManager.disconnect();

}

//然后是一个实际应用方法,只验证过没有密码的情况:

publicWifiConfiguration CreateWifiInfo(String SSID, String Password,intType)

{

WifiConfiguration config = newWifiConfiguration();

config.allowedAuthAlgorithms.clear();

config.allowedGroupCiphers.clear();

config.allowedKeyManagement.clear();

config.allowedPairwiseCiphers.clear();

config.allowedProtocols.clear();

config.SSID = "\""+ SSID +"\"";

WifiConfiguration tempConfig = this.IsExsits(SSID);

if(tempConfig !=null) {

mWifiManager.removeNetwork(tempConfig.networkId);

}

if(Type ==1)//WIFICIPHER_NOPASS

{

config.wepKeys[0] ="";

config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);

config.wepTxKeyIndex = 0;

}

if(Type ==2)//WIFICIPHER_WEP

{

config.hiddenSSID = true;

config.wepKeys[0]="\""+Password+"\"";

config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);

config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);

config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);

config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);

config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);

config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);

config.wepTxKeyIndex = 0;

}

if(Type ==3)//WIFICIPHER_WPA

{

config.preSharedKey = "\""+Password+"\"";

config.hiddenSSID = true;

config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);

config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);

config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);

config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);

//config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);

config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);

config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);

config.status = WifiConfiguration.Status.ENABLED;

}

returnconfig;

}

privateWifiConfiguration IsExsits(String SSID)

{

List existingConfigs = mWifiManager.getConfiguredNetworks();

for(WifiConfiguration existingConfig : existingConfigs)

{

if(existingConfig.SSID.equals("\""+SSID+"\""))

{

returnexistingConfig;

}

}

returnnull;

}

}

//分为三种情况:1没有密码2用wep加密3用wpa加密

改动主要集中在CreateWifiInfo这个方法中,并且添加了一个私有方法:

(1)将与方法的第三个参数有关的变量都改成int型,或者使用原作者的枚举型(存在bug需要改正),但枚举会在后续的开发中遇到些困难;

(2)在if(type == 3)中注释掉“config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);”,并添加“

config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);“这两句,否则当wifi热点需要输入密码时,无法加入网络。

(3)在代码末尾添加了方法IsExsits,原因在于如果按照网上介绍的方法成功加入指定的wifi后,都会在终端的wifi列表中新添加一个以该指定ssid的网络,所以每运行一次程序,列表中就会多一个相同名字的ssid。而该方法就是检查wifi列表中是否有以输入参数为名的wifi热点,如果存在,则在CreateWifiInfo方法开始配置wifi网络之前将其移除,以避免ssid的重复:

WifiConfiguration tempConfig = this.IsExsits(SSID);

if(tempConfig != null) {

mWifiManager.removeNetwork(tempConfig.networkId);

}

以上便是wifi工具类的建立,之后就可以在其他部分实例化这个类,调用其中的方法完成加入指定ssid的wifi热点,还是先上代码吧,建立一个名为Test_wifiActivity.java的文件(同上,没有包含包声明和import语句):

publicclassTest_wifiActivityextendsActivity {

/** Called when the activity is first created. */

@Override

publicvoidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

WifiAdmin wifiAdmin = newWifiAdmin(this);

wifiAdmin.openWifi();

wifiAdmin.addNetwork(wifiAdmin.CreateWifiInfo("XXX","XXX",3));

}

}

很简单,如果是接入wifi,大体上只涉及到openWifi(打开wifi)、CreateWifiInfo(配置wifi网络信息)和addNetwork(添加配置好的网络并连接),对CreateWifiInfo进行简单的说明:第一参数是SSID的名称;第二个参数是指定SSID网络的密码,当不需要密码是置空(”“);第三个参数是热点类型:1-无密码 / 2-WEP密码验证(未测试)/ 3-WAP或WAP2 PSK密码验证。

最后就是在Manifest中添加相应的权限了:

如果按照上述的方法进行开发,就可以很傻瓜的通过改变Test_wifiActivity.java中的CreateWifiInfo方法的三个入口参数实现加入指定SSID的wifi热点了,无论该热点是否需要密码认证。

以上就是我对于自动连接指定SSID的wifi热点的学习心得,由于水平有限有些地方可能介绍错误,希望大家多多批评指正!

android 扫描wifi列表重复,Android Settings 出现重复的WIFI SSID,多个相同的WIFI SSID相关推荐

  1. android 加载列表占位,Android Paging库使用详解(小结)

    Android分页包能够更轻易地在RecyclerView里面缓慢且优雅地加载数据. 许多应用从数据源消耗数据, 数据源里面有大量的数据, 但是一次却只展示一小部分. 分页包帮助应用观测和展示大量数据 ...

  2. android扫描sd卡图片,Android SD卡 全盘文件扫描

    在开发的过程中,有时候会遇到需要读取多媒体文件的需求,面对这样的需求,通常我们有两种解决方案:自己扫描全盘文件,或者使用ContentResolver读取系统记录. 一般需求不是特别复杂的情况下,直接 ...

  3. android读取应用列表权限,Android获取系统应用及安装应用的权限列表

    主要通过PackageManager中的方法 代码: public class InstallApps extends ListActivity { HashMap map=new HashMap() ...

  4. android通话记录列表apk,android打电话,发短信,获取通讯录、通话记录、短信记录...

    [实例简介] 代码实现android打电话,发短信,获取通讯录.通话记录.短信记录 [实例截图] [核心代码] 19287b5f-b70c-4210-ab04-9d24ddd60788 └── cal ...

  5. android实现日志列表,【Android开发】listview+popupwindow实践:日志列表

    用listview的标准形式弄一个listview出来,然后创建一个布局item给listview,其中在adapter重写的getview()方法中把item布局给它.而且可以设置多个集合,在get ...

  6. android仿QQ列表实现 android studio大作业,android studio课程设计

    1. 效果图 2.功能介绍:登录,注册,好友列表 3.核心代码 /*** 登录页面*/ public class LoginActivity extends BaseActivity {private ...

  7. Android wifi列表扫描 密码连接 多个wifi切换登录 广播状态等都在这里

    Wi-Fi 前言 需求 实现 扫描wifi列表 wifi广播 wifi连接登录 总结 前言 app里有个需求就是在应用内部开发一个wifi设置的功能,避免用户跳到手机wifi设置界面操作,之前没开发过 ...

  8. iOS 无法获取 WiFi 列表?一定是因为你不知道这个框架

    iOS 9 发布之后,苹果推出了 NetworkExtension,利用这个框架可以实现很多和网络相关的操作.本文主要介绍怎样使用其中的 NEHotspotHelper 进行设备 WiFi 列表的获取 ...

  9. android 高版本(设备11的)wifi扫描,获取wifi列表

    需求场景:智能设备有wifi模块,整套wifi功能,包括:搜索wifi列表,wifi连接,wifi切换,wifi忘记密码等. 高版本(安卓8以上)为了省电,节流,谷歌对wifi限制越来越多,安卓9以上 ...

  10. android wifi动画显示,Android获取WiFi列表的正确用法

    最近有个需求,需要做一个获取WiFi列表的功能,也在网上找了一些资料,但有些资料是有问题的,然后经过自己的摸索,总结如下: 本地环境: Android Studio版本:3.0.1:DEMO APK ...

最新文章

  1. 使用python重命名某个文件下的所有的文件
  2. oracle按时间导出,如何为Oracle导出文件加上时间戳
  3. java连续输入_java – 要求用户进行多次输入
  4. MySQL 5.7建表时date类型提示默认值类型错误的问题处理
  5. android布局1
  6. Linux备份全攻略
  7. 我自己比较习惯的Watir自动化测试代码管理方式
  8. Python之协程、异步IO、redis缓存、rabbitMQ队列
  9. java对接云之家群聊机器人
  10. Python学习总结(10) python中数据的常用操作之切片和迭代
  11. 数学基础差怎么补救,怎么学数学最快最有效的方法
  12. Service Test1
  13. Everything Is Generated In Equal Probability HDU 6595(期望dp)
  14. android ip格式化输入法,Android设置默认输入法
  15. php手绘功能,手绘之于游戏,不仅仅是一种风格
  16. 计算机网络与通信缩读,网络课件子讲稿规范.ppt
  17. 快速排序的三种划分算法
  18. 陈天奇:首个机器学习编译课程!
  19. LVS基本概念及要诀(优化)
  20. FileUnhider for mac(一键文件隐藏和显示工具)

热门文章

  1. SPT20 协议_【推荐】协议离婚协议书范文7篇
  2. MayaDay1:历史记录和删除历史记录
  3. 爬虫之汽车之家/抽屉新热榜/煎蛋网
  4. MySQL 查询本月各周
  5. mathpix安装和使用详细教程
  6. 网安渗透测试面试集1
  7. 计算机英语四六级对调剂有影响吗,四六级没过影响考研复试和调剂吗?各高校标准不一...
  8. latex 定义作者,通讯作者,联系地址宏包,package,authblk
  9. android 分享到YouTube失败 403
  10. IP地址配置错误网络无法连接怎么解决Win10?