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. 数据结构和算法:(3)3.1线性表的顺序存储结构
  2. [转载]用数据说话 Pytorch详解NLLLoss和CrossEntropyLoss
  3. 他开发了 redux,昨晚“字节一面”却挂了?
  4. 获取视频的每一帧,并保存为.jpg图片
  5. Gitlab-ci 替代 webhook 触发Jenkins job
  6. 计算机专业哪些证书可以抵个税,2020年度个人所得税汇算清缴进行时 职业资格证书有哪些能抵扣个税?...
  7. P678-vect2.cpp
  8. 使用Chrome的inspect element注意事项
  9. 简介DOTNET 编译原理 简介DOTNET 编译原理 简介DOTNET 编译原理
  10. bool查询原理 es_ES系列之原理copy_to用好了这么香
  11. 计算日期时间间隔,可计算情侣计算在一起的。精确到,天,时,分,秒(输入的日期距离现在有:819天19670小时1180221分钟70813262秒)
  12. 《精通Linux设备驱动程序开发》——1.6 查看源代码
  13. 2022年上半年网络工程师下午真题及答案
  14. Android Studio 全局搜索技巧
  15. C语言lseek()函数和 fseek()函数 rewind函数
  16. 016.文件和目录操作命令--md5sum
  17. 这 4 个超实用的 Docker 镜像构建技巧!你不会不知道吧?
  18. 《象与骑象人》摘要及一点想法
  19. 数据仓库系列3-事实表
  20. INCA官方手册阅读记录

热门文章

  1. ceph rbd mysql_ceph-rbd使用
  2. 重启计算机网络连接巨慢,开机后宽带连接很慢怎么办 开机后宽带连接很慢的三步解决办法...
  3. Gary Marcus再发万字长文,列14个QA回应机器学习批判言论
  4. 解决mysql 1864 主从错误
  5. 抖音 iOS 推荐 Feed 容器化总结
  6. mta android 网速监控,网速监控
  7. ios 网速监控_iOS开发网络篇—监测网络状态
  8. 操作系统安全防范措施
  9. HTML+CSS静态页面网页设计作业——甜品奶茶店(19页) HTML5网页设计成品_学生DW静态网页设计_web课程设计网页制作
  10. 四六级分数竟是这样算出来的!交白卷都不会得零分 (转)