【Android开发】wifi开关与wifi连接(密码连接)
2015-12-28 09:30
986 查看
过放荡不羁的生活,容易得像顺水推舟,但是要结识良朋益友,却难如登天。—— 巴尔扎克
本文demo来自网络,找了好久找到的,后面自己做了些许修改,这里对源码解析,愧于忘记哪里出来了,感谢作者!
接下来就记录一下wifi开发的一些学习心得,这边先看几张效果图吧!
![](http://img.blog.csdn.net/20151228092809954?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20151228092901244?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
本文大纲:
1. 当前wifi连接信息
2. 开关wifi(自动连接已经配置过的wifi)
3. Wifi扫描,选择要连接的wifi,使用密码连接
内容:
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的连接信息使用:
打印wifiInfo主要方法的信息:
![](http://img.blog.csdn.net/20151228090733819?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
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代码:
打开wifi :
关闭wifi :
注:开关wifi,系统会自动识别保存过密码的wifi去连接
扫描步骤:
wifiManager.startScan(); //开启扫描
scanResultList = wifiManager.getScanResults(); // 扫描返回结果列表
打印一个ScanResult的数据
![](http://img.blog.csdn.net/20151228091654686?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
数据说明:
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方法,代码如下:
B.连接未配置的wifi
输入密码,根据密码创建一个配置信息类
WifiConfiguration wifiConfig = this.CreateWifiInfo(SSID, Password, Type);
注:这里的type是wifi的加密类型,加密类型查看源码有
一般使用WIFICIPHER_WPA这种加密方式,还有web以及无密码的方式。
然后调用addNetwork把配置信息加入WifiManager(这里返回networkId ),加入后默认是DISABLED(即断开状态的),还要再调用WifiManager.enableNetwork(int netId, boolean disableOthers)去启用,这里传入参数addNetwork方法返回的networkId ,就能启动连接了,布尔值传入true,关闭别的网络,代码:
源码点击下载
本文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 权限
- Android AsyncTask详解
- Android文件浏览器
- Android反射例子的学习
- android开发游记:弹出窗和底部弹出窗的实现和动画效果
- Android---再按一次退出页面
- 《Android源码设计模式解析与实战》读书笔记(十二)
- Android Kitkat 如何让系统永久不休眠
- Android:Attribute is missing the Android namespace prefix
- android的显式提交和隐式提交
- android删除文件出错
- 欢迎使用CSDN-markdown编辑器
- android130 android启动
- Android遇到java.lang.RuntimeException: Binary XML file line #20这样的问题怎么办
- Android开发之ActionBar与DrawerLayout
- Android官方刷新组件 SwipeRefreshLayout 的使用
- [android]_[ListView的基本使用]
- [android]_[四种基本布局]
- Android开发之应用程序创建与目录结构
- android 属性动画(view普通使用 和 自定义view使用)