今天公司的一个项目中的某一个功能正好需要切换wifi热点的连接,所有顺带记录一下
代码:http://download.csdn.net/detail/zhudonggangg/9803438
android本身已经提供了包来处理Android环境下对Wifi的操作,位置是android.net.wifi下面。调用wifi操作需要在mainfest中添加对应权限。
官方提供的大致可以分为四个主要的类:WifiManager,ScanResult,WifiConfiguration,WifiInfo,此外还有WifiLock,MulticastLock等
提供wifi管理的各种主要API,主要包含wifi的扫描,建立连接,配置等
(要操作 WIFI 设备,需要先获取 Context.getSystemService(Context.WIFI_SERVICE)获取WifiManager 对象,并通过这个对象来管理WIFI设备。 )
addNetwork(WifiConfiguration config) 添加一个config描述的WIFI网络,默认情况下,这个WIFI网络是DISABLE状态的。
calculateSignalLevel(int rssi , int numLevels) 计算信号的等级
compareSignalLevel(int rssiA, int rssiB) 对比网络A和网络B的信号强度
createWifiLock(int lockType, String tag) 创建一个WIFI 锁,锁定当前的WIFI连接
disableNetwork(int netId) 让一个网络连接失效
disconnect() 断开当前的WIFI连接
enableNetwork(int netId, Boolean disableOthers) 连接netId所指的WIFI网络,并是其他的网络都被禁用
getConfiguredNetworks() 获取网络连接的状态
getConnectionInfo() 获取当前连接的信息
getDhcpInfo() 获取DHCP 的信息
getScanResulats() 获取扫描测试的结果
getWifiState() 获取当前WIFI设备的状态
isWifiEnabled() 判断WIFI设备是否打开
pingSupplicant() ping操作,和PC的ping操作相同作用
ressociate() 重新连接WIFI网络,即使该网络是已经被连接上的
reconnect() 重新连接一个未连接上的WIFI网络
removeNetwork() 移除某一个网络
saveConfiguration() 保留一个配置信息
setWifiEnabled() 让一个连接有效
startScan() 开始扫描
updateNetwork(WifiConfiguration config) 更新一个网络连接
描述开启扫描后的Wifi热点的信息。包含SSID、Capabilities、frequency、level(信号强度)等。
ListscanResults=mWifiManager.getScanResults();//搜索到的设备列表s tv01.setText(""); for (ScanResult scanResult:scanResults){ //设备名称是这wifi热点的名字 tv01.append("\n设备名称:"+scanResult.SSID+"\nBSSID接入点的地址:"+scanResult.BSSID+"\n网络接入的性能:"+scanResult.capabilities+"\n热点的频率(MHz)"+scanResult.frequency+"\n信号强度:"+scanResult.level+"\n计算信号的等级 :"+mWifiManager.calculateSignalLevel(scanResult.level,10)+"\n"+"\n"); }
getBSSID() 获取BSSID属性
getDetailedStateOf() 获取客户端的连通性
getHiddenSSID() 获取SSID 是否被隐藏
getIpAddress() 获取IP 地址
getLinkSpeed() 获取连接的速度
getMacAddress() 获取Mac 地址
getRssi() 获取802.11n 网络的信号
getSSID() 获取SSID
getSupplicanState() 获取具体客户端状态的信息
// 返回返回当前连接的wifi的相关信息 private void getConnectionInfoss(){ // WifiInfo mWifiInfo=mWifiManager.getConnectionInfo(); String ipText = intToIp(mWifiInfo.getIpAddress());//mWifiInfo.getIpAddress()这个得到的是十进位的数字,需要转化成192.168.xxx.xx的形式 int networkID = mWifiInfo.getNetworkId(); tv01.setText(""); tv01.append("\n获取BSSID属性:"+mWifiInfo.getBSSID()+"\n 获取IP 地址 :"+ipText +"\n设备名称:"+mWifiInfo.getSSID() +"\nnetworkID "+networkID+"\n获取Mac 地址:"+mWifiInfo.getMacAddress()); } private String intToIp(int ip){ // java将IP地址转换为数字以及逆向转换(位运算和0xFF的使用) return (ip & 0xFF) + "." + ((ip >> 8) & 0xFF) + "." + ((ip >> 16) & 0xFF) + "." + ((ip >> 24) & 0xFF); }
描述wifi的连接信息,包含SSID、SSID隐藏、Password等的设置。
//
这个方法可以连接到指定的wifi,Type=3已经测试过了,可以使用
public WifiConfiguration CreateWifiInfo(String SSID,String Password,int Type){ WifiConfiguration config=new WifiConfiguration(); 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 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 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; } return config; } //这个方法的作用在于如果按照网上介绍的方法成功加入指定的wifi后,都会在终端的wifi列表中新添加一个以该指定ssid的网络,所以每运行一次程序, //列表中就会多一个相同名字的ssid。而该方法就是检查wifi列表中是否有以输入参数为名的wifi热点,如果存在,则在CreateWifiInfo方法开始 //配置wifi网络之前将其移除,以避免ssid的重复: private WifiConfiguration IsExsits(String SSID) { ListexistingConfigs = mWifiManager.getConfiguredNetworks(); for (WifiConfiguration existingConfig : existingConfigs) { if (existingConfig.SSID.equals("\""+SSID+"\"")) { return existingConfig; } } return null; }
网络权限
android:name="android.permission.CHANGE_NETWORK_STATE"/>
android:name="android.permission.CHANGE_WIFI_STATE" />
android:name="android.permission.ACCESS_NETWORK_STATE" />
android:name="android.permission.ACCESS_WIFI_STATE" />
WifiManager wm = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
bRet = wifiManager.isWifiEnabled();//判断是否开启
bRet = wifiManager.setWifiEnabled(true);//设置开启关闭
注意,调用setWifiEnabled后,系统进行wifi模块的开启需要一定时间,此时通过wifiManager.getWifiState()获取的状态来判断是否完成。
WifiManager.WIFI_STATE_DISABLED : WIFI网卡不可用(1)
WifiManager.WIFI_STATE_DISABLING : WIFI网卡正在关闭(0)
WifiManager.WIFI_STATE_ENABLED : WIFI网卡可用(3)
WifiManager.WIFI_STATE_ENABLING : WIFI网正在打开(2) (WIFI启动需要一段时间)
WifiManager.WIFI_STATE_UNKNOWN : 未知网卡状态
while (wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLING) { try { Thread.currentThread(); Thread.sleep(100); } catch (InterruptedException ie) { } }
ListexistingConfigs = wifiManager.getConfiguredNetworks();//获取保存的配置信息
for (WifiConfiguration existingConfig : existingConfigs) { if (existingConfig.SSID.equals("/"" + SSID + "/"")) { return existingConfig; }}
wifiManager.disableNetwork(existingConfig.networkId);
wifiManager.removeNetwork(networkId);