【Android开发】wifi开关与wifi连接(密码连接)
过放荡不羁的生活,容易得像顺水推舟,但是要结识良朋益友,却难如登天。—— 巴尔扎克
本文demo来自网络,找了好久找到的,后面自己做了些许修改,这里对源码解析,愧于忘记哪里出来了,感谢作者!
接下来就记录一下wifi开发的一些学习心得,这边先看几张效果图吧!
本文大纲:
1. 当前wifi连接信息
2. 开关wifi(自动连接已经配置过的wifi)
3. Wifi扫描,选择要连接的wifi,使用密码连接
内容:
1. 当前wifi连接信息
首先先加入这个demo用到的几个权限
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" ></uses-permission><uses-permission android:name="android.permission.CHANGE_WIFI_STATE" ></uses-permission><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" ></uses-permission><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" ></uses-permission>
Wifi相关操作这里demo创建了WifiAdmin这个类,作为业务类,这里首先我们要获取当前wifi的状态
获取wifi连接状态使用:int android.net.wifi.WifiManager.getWifiState()
Wifi状态有:
WIFI_STATE_DISABLED wifi已关闭
WIFI_STATE_DISABLING wifi正在关闭
WIFI_STATE_ENABLED wifi已连接
WIFI_STATE_ENABLING wifi正在连接
WIFI_STATE_UNKNOWN wifi未知状态
获取当前wifi的连接信息使用:
WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
打印wifiInfo主要方法的信息:
wifiInfo.getBSSID() 得到无线的Mac地址
wifiInfo.getHiddenSSID() 未知(true if this network does not broadcast its SSID, so an SSID-specific probe request must be used for scans.)
wifiInfo.getIpAddress() int类型ip地址,需要转成String
wifiInfo.getLinkSpeed() 连接速度,单位Mbps
wifiInfo.getNetworkId() 网络标识id(wifi名称改掉,会跟着变)
wifiInfo.getRssi() 当前无线网络的信号强度指示器
wifiInfo.getSSID() 当前无线网络的名称
wifiInfo.describeContents() 未知
注:
Int类型ip转String类型ip代码:
public String ipIntToString(int ip) {
try {
byte[] bytes = new byte[4];
bytes[0] = (byte) (0xff & ip);
bytes[1] = (byte) ((0xff00 & ip) >> 8);
bytes[2] = (byte) ((0xff0000 & ip) >> 16);
bytes[3] = (byte) ((0xff000000 & ip) >> 24);
return Inet4Address.getByAddress(bytes).getHostAddress();
} catch (Exception e) {
return "";
}
}
2. 开关wifi
打开关闭wifi使用wifiManager.setWifiEnabled()的方法,打开关闭前,先要判断wifi的状态,使用isWifiEnabled()方法。
打开wifi :
/*** 打开wifi功能* * @return true or false*/
public boolean OpenWifi() {
boolean bRet = true;
if (!wifiManager.isWifiEnabled()) {
bRet = wifiManager.setWifiEnabled(true);
}
return bRet;
}
关闭wifi :
/*** 关闭wifi* * @return*/
public boolean closeWifi() {
if (!wifiManager.isWifiEnabled()) {
return true;
} else {
return wifiManager.setWifiEnabled(false);
}
}
注:开关wifi,系统会自动识别保存过密码的wifi去连接
3. Wifi扫描,选择要连接的wifi,使用密码连接
Wifi扫描结果的列表使用List<ScanResult> 保存
扫描步骤:
wifiManager.startScan(); //开启扫描
scanResultList = wifiManager.getScanResults(); // 扫描返回结果列表
打印一个ScanResult的数据
数据说明:
ScanResult:
BSSID:fc:e3:3c:4e:f0:34
capabilities:[WPA-PSK-TKIP][ESS] 加密方案
frequency:2412
level:-48 信号的强弱标志(单位dBm分贝毫伏)
SSID:ChinaNet-kgdp wifi名称
timestamp:238673772811
describeContents():0
level根据数值可以分为5个等级的信号强弱:
Level>-50 信号最强4格
-50<Level<-65 信号3格
-65<Level<-75 信号2格
-75<Level<-90 信号1格
-90<Level 信号0格
Ps: 也可以做更细的划分
选择wifi进行连接,这里分为连接已经配置过的wifi以及未配置过的wifi
A.连接已经配置过wifi
检查是否已经配置过该wifi,通过WifiManager获取已经配置的wifi列表
List<WifiConfiguration> existingConfigs = wifiManager.getConfiguredNetworks();
传入要连接的wifi的SSID(即wifi名称,匹配得到则不用输入密码即可连接,匹配不到则要输入密码才能连接)
这里需要注意的是:WifiConfiguration里封装的wifi的SSID是包含双引号的,而ScanResult的SSID是不包含双引号的,这里进行遍历比较时需要注意!
对于连接已经配置过的wifi,这里遍历的结果返回一个WifiConfiguration的对象,拿来实现连接;另外这里的wifiManager已经存在了要连接的wifi的networkId,所以不用重新调用wifiManager的addNetwork方法,代码如下:
/*** 已有配置链接* * @param wf* @return*/
public boolean Connect(WifiConfiguration wf) {
if (!this.OpenWifi()) {
return false;
}
// 状态变成WIFI_STATE_ENABLED的时候才能执行下面的语句,即当状态为WIFI_STATE_ENABLING时,让程序在while里面跑
while (wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLING) {
try {
// 为了避免程序一直while循环,让它睡个100毫秒在检测……
Thread.currentThread();
Thread.sleep(100);
} catch (InterruptedException ie) {
}
}
boolean bRet = wifiManager.enableNetwork(wf.networkId, true);
wifiManager.saveConfiguration();
return bRet;
}
B.连接未配置的wifi
输入密码,根据密码创建一个配置信息类
WifiConfiguration wifiConfig = this.CreateWifiInfo(SSID, Password, Type);
注:这里的type是wifi的加密类型,加密类型查看源码有
/*** 加密类型* * @author Administrator* */public enum WifiCipherType {WIFICIPHER_WEP, WIFICIPHER_WPA, WIFICIPHER_NOPASS, WIFICIPHER_INVALID}
一般使用WIFICIPHER_WPA这种加密方式,还有web以及无密码的方式。
然后调用addNetwork把配置信息加入WifiManager(这里返回networkId ),加入后默认是DISABLED(即断开状态的),还要再调用WifiManager.enableNetwork(int netId, boolean disableOthers)去启用,这里传入参数addNetwork方法返回的networkId ,就能启动连接了,布尔值传入true,关闭别的网络,代码:
/*** 无配置记录链接方式* * @param SSID* @param Password* @param Type* @return true or false*/
public boolean Connect(String SSID, String Password, WifiCipherType Type) {
if (!this.OpenWifi()) {
return false;
}
// 状态变成WIFI_STATE_ENABLED的时候才能执行下面的语句
while (wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLING) {
try {
// 为了避免程序一直while循环,让它睡个100毫秒在检测……
Thread.currentThread();
Thread.sleep(100);
} catch (InterruptedException ie) {
}
}WifiConfiguration wifiConfig = this
.CreateWifiInfo(SSID, Password, Type);
int netID = wifiManager.addNetwork(wifiConfig);
boolean bRet = wifiManager.enableNetwork(netID, true);
wifiManager.saveConfiguration();
return bRet;
}
源码点击下载
欢迎关注我的公众号,获取更多开发相关文章!
您的关注是对我最大的鼓励!
【Android开发】wifi开关与wifi连接(密码连接)相关推荐
- android开发打开wifi密码,【Android开发】wifi开关与wifi连接(密码连接)
过放荡不羁的生活,容易得像顺水推舟,但是要结识良朋益友,却难如登天.-- 巴尔扎克 本文demo来自网络,找了好久找到的,后面自己做了些许修改,这里对源码解析,愧于忘记哪里出来了,感谢作者! 接下来就 ...
- android 图片热点区域,Android开发之扫描附近wifi热点并列表显示
最近项目中用到了wifi模块,今天做一个简单的总结. 参考:http://www.2cto.com/kf/201310/253617.html 1.怎样获取wifi对象并进行操作 要操作WIFI设备, ...
- android开发:保存并且记住账号密码,输入输出流
保存到data里面 方法一:这种保存方法并不提倡使用,因为绝对路径换一个环境可能就不能使用了 //传过来的参数用##拼接成一个字符串String info=name+"##"+pa ...
- Android 开发利用wifi调试
本文主要介绍在Android开发中如何利用wifi进行应用调试以及其原理.通常我们都是通过数据线连接手机终端和PC进行调试,在没有数据线的情况下如何连接PC和手机呢. 1.要求 手机必须root过,手 ...
- 学习Android开发
上周末的任务完全没有完成,只顾着玩新拿到里程碑了... 这周主要任务学习Android开发,完成简单WiFi client UI设计. 1.学习Android开发 周一到周三 主要通过<Andr ...
- 【Android开发—智能家居系列】(三):手机连接WIFI模块
[Android开发-智能家居系列](三):手机连接WIFI模块 概述 实现连接WIFI的功能会用到一个工具类,源码可以点击链接下载.网上这些类似的工具类里的代码差不多是一样的.连接无线网主要有两个方 ...
- Android wifi列表扫描 密码连接 多个wifi切换登录 广播状态等都在这里
Wi-Fi 前言 需求 实现 扫描wifi列表 wifi广播 wifi连接登录 总结 前言 app里有个需求就是在应用内部开发一个wifi设置的功能,避免用户跳到手机wifi设置界面操作,之前没开发过 ...
- android 获取wifi的加密类型,Android WIFI开发:获取wifi列表,连接指定wifi,获取wifi加密方式,监听wifi网络变化等...
下面是 Android 开发中 WiFi 的常用配置,如:获取当前 WiFi ,扫描 WiFi 获取列表,连接指定 WiFi ,监听网络变化等等. 下面是效果图: GitHub 下载地址:https: ...
- android获取wifi开关,Android WiFi开发(一)--WiFi开关与状态监听
之前开发了一个WiFi,热点相关的应用.因为对这方面也不熟悉,刚开始找资料看书,但看明白实现时,发现随着android版本更新,相关api有较大改动,之前的代码不能用.经过一番探索,最后实现出来了,现 ...
最新文章
- DNS报文格式(RFC1035)
- 程序猿修仙之路--算法之直接插入排序
- 新的一年,对产品和产品经理的感悟
- 一鼓作气 博客--第六篇 note6
- STL容器删除元素的陷阱
- 牛客13584 日历中的数字
- socket io 不使用redis_为什么Redis单线程能够达到数十万、百万级的QPS?
- Spark RDD Transformation
- 91. php 命名空间(1)
- C# 使用 iTextSharp 将 PDF 转换成 TXT 文本
- 【Python爬虫实战】使用Selenium爬某音乐歌曲及评论信息啦~
- 使用Bochs写Hello world
- python爬虫怎么保存图片_使用Python爬虫怎么将网页图片保存到本地
- 项目组织结构的3种类型:职能型、项目型和矩阵型
- Layim 自定义聊天界面
- ARVR技术 | AR, VR, MR和XR?想搞清楚不?
- 练习6:多表关联查询、嵌套子查询
- 欧几里德 与 扩展欧几里得 学习笔记
- 盖茨和李嘉诚双龙卸甲 他们的区块链业务一个在链圈扶贫 一个在币圈赚钱
- 哪个免费查重系统会更靠谱呢?
热门文章
- JAVA-国密算法SM3和SM4应用Example
- manga camera android,SMAAASH! Camera [Manga Photo]
- 【ubuntu使用排坑】fsckd-cancel-msg:Press Ctrl+C to cancel all filesystem checks
- oracle omf管理,使用OMF管理表空间
- C++初学者必练基础编程题【第一期】
- vivo NEX3史上最强旗舰机!瀑布屏+骁龙855+44W+5G,对战华为
- offer来了java面试百度云版,精心整理
- 优秀logo,最基础的设计技巧(四)
- 参赛邀请 | 第二届古汉语自动分析国际评测EvaHan(古汉语机器翻译)开始报名...
- python read()读取图片_可以python sitk.ReadImage读取列表/系列图像吗?