【Android开发】wifi开关与wifi连接(密码连接)

本文介绍了Android中关于WiFi开发的相关知识,包括获取当前WiFi连接信息、开关WiFi以及扫描并连接WiFi的步骤。详细讲解了如何使用WifiManager进行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;
}


源码点击下载

欢迎关注我的公众号,获取更多开发相关文章!

您的关注是对我最大的鼓励!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leafseelight

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值