android 扫描wifi列表重复,Android Settings 出现重复的WIFI SSID,多个相同的WIFI SSID
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相关推荐
- android 加载列表占位,Android Paging库使用详解(小结)
Android分页包能够更轻易地在RecyclerView里面缓慢且优雅地加载数据. 许多应用从数据源消耗数据, 数据源里面有大量的数据, 但是一次却只展示一小部分. 分页包帮助应用观测和展示大量数据 ...
- android扫描sd卡图片,Android SD卡 全盘文件扫描
在开发的过程中,有时候会遇到需要读取多媒体文件的需求,面对这样的需求,通常我们有两种解决方案:自己扫描全盘文件,或者使用ContentResolver读取系统记录. 一般需求不是特别复杂的情况下,直接 ...
- android读取应用列表权限,Android获取系统应用及安装应用的权限列表
主要通过PackageManager中的方法 代码: public class InstallApps extends ListActivity { HashMap map=new HashMap() ...
- android通话记录列表apk,android打电话,发短信,获取通讯录、通话记录、短信记录...
[实例简介] 代码实现android打电话,发短信,获取通讯录.通话记录.短信记录 [实例截图] [核心代码] 19287b5f-b70c-4210-ab04-9d24ddd60788 └── cal ...
- android实现日志列表,【Android开发】listview+popupwindow实践:日志列表
用listview的标准形式弄一个listview出来,然后创建一个布局item给listview,其中在adapter重写的getview()方法中把item布局给它.而且可以设置多个集合,在get ...
- android仿QQ列表实现 android studio大作业,android studio课程设计
1. 效果图 2.功能介绍:登录,注册,好友列表 3.核心代码 /*** 登录页面*/ public class LoginActivity extends BaseActivity {private ...
- Android wifi列表扫描 密码连接 多个wifi切换登录 广播状态等都在这里
Wi-Fi 前言 需求 实现 扫描wifi列表 wifi广播 wifi连接登录 总结 前言 app里有个需求就是在应用内部开发一个wifi设置的功能,避免用户跳到手机wifi设置界面操作,之前没开发过 ...
- iOS 无法获取 WiFi 列表?一定是因为你不知道这个框架
iOS 9 发布之后,苹果推出了 NetworkExtension,利用这个框架可以实现很多和网络相关的操作.本文主要介绍怎样使用其中的 NEHotspotHelper 进行设备 WiFi 列表的获取 ...
- android 高版本(设备11的)wifi扫描,获取wifi列表
需求场景:智能设备有wifi模块,整套wifi功能,包括:搜索wifi列表,wifi连接,wifi切换,wifi忘记密码等. 高版本(安卓8以上)为了省电,节流,谷歌对wifi限制越来越多,安卓9以上 ...
- android wifi动画显示,Android获取WiFi列表的正确用法
最近有个需求,需要做一个获取WiFi列表的功能,也在网上找了一些资料,但有些资料是有问题的,然后经过自己的摸索,总结如下: 本地环境: Android Studio版本:3.0.1:DEMO APK ...
最新文章
- 数据结构和算法:(3)3.1线性表的顺序存储结构
- [转载]用数据说话 Pytorch详解NLLLoss和CrossEntropyLoss
- 他开发了 redux,昨晚“字节一面”却挂了?
- 获取视频的每一帧,并保存为.jpg图片
- Gitlab-ci 替代 webhook 触发Jenkins job
- 计算机专业哪些证书可以抵个税,2020年度个人所得税汇算清缴进行时 职业资格证书有哪些能抵扣个税?...
- P678-vect2.cpp
- 使用Chrome的inspect element注意事项
- 简介DOTNET 编译原理 简介DOTNET 编译原理 简介DOTNET 编译原理
- bool查询原理 es_ES系列之原理copy_to用好了这么香
- 计算日期时间间隔,可计算情侣计算在一起的。精确到,天,时,分,秒(输入的日期距离现在有:819天19670小时1180221分钟70813262秒)
- 《精通Linux设备驱动程序开发》——1.6 查看源代码
- 2022年上半年网络工程师下午真题及答案
- Android Studio 全局搜索技巧
- C语言lseek()函数和 fseek()函数 rewind函数
- 016.文件和目录操作命令--md5sum
- 这 4 个超实用的 Docker 镜像构建技巧!你不会不知道吧?
- 《象与骑象人》摘要及一点想法
- 数据仓库系列3-事实表
- INCA官方手册阅读记录
热门文章
- ceph rbd mysql_ceph-rbd使用
- 重启计算机网络连接巨慢,开机后宽带连接很慢怎么办 开机后宽带连接很慢的三步解决办法...
- Gary Marcus再发万字长文,列14个QA回应机器学习批判言论
- 解决mysql 1864 主从错误
- 抖音 iOS 推荐 Feed 容器化总结
- mta android 网速监控,网速监控
- ios 网速监控_iOS开发网络篇—监测网络状态
- 操作系统安全防范措施
- HTML+CSS静态页面网页设计作业——甜品奶茶店(19页) HTML5网页设计成品_学生DW静态网页设计_web课程设计网页制作
- 四六级分数竟是这样算出来的!交白卷都不会得零分 (转)