WIFI就是一种无线联网技术,常见的是使用无线路由器。那么在这个无线路由器的信号覆盖的范围内都可以采用WIFI连接的方式进行联网。如果无线路由器连接了一个ADSL线路或其他的联网线路,则又被称为“热点”。
在Android中对Wifi操作,android本身提供了一些有用的包,在android.net.wifi包下面,主要包括以下几个类和接口:
1.ScanResult
主要用来描述已经检测出的接入点,包括接入点的地址,接入点的名称,身份认证,频率,信号强度等信息。其实就是通过wifi 硬件的扫描来获取一些周边的wifi 热点的信息。
2.WifiConfiguration
Wifi网络的配置,包括安全设置等,在我们连通一个wifi 接入点的时候,需要获取到的一些信息。主要包含四个属性:
BSSID:
BSS是一种特殊的Ad-hoc LAN(一种支持点对点访问的无线网络应用模式)的应用,一个无线网络至少由一个连接到有线网络的AP和若干无线工作站组成,这种配置称为一个基本服务装置。一群计算机设定相同的 BSS名称,即可自成一个group,而此BSS名称,即所谓BSSID。通常,手机WLAN中,bssid其实就是无线路由的MAC地址。
networkid:网络ID。
PreSharedKey:无线网络的安全认证模式。
SSID:SSID(Service Set Identif)用于标识无线局域网,SSID不同的无线网络是无法进行互访的。
3.WifiInfo
wifi无线连接的描述,包括(接入点,网络连接状态,隐藏的接入点,IP地址,连接速度,MAC地址,网络ID,信号强度等信息)。这里简单介绍一下WifiManager中常用的方法:
getSSID() | 获得SSID(热点名称) |
getBSSID() | 获取BSSID |
getDetailedStateOf() | 获取客户端的连通性 |
getHiddenSSID() | 获得SSID 是否被隐藏 |
getIpAddress() | 获取IP 地址 |
getLinkSpeed() | 获得连接的速度 |
getMacAddress() | 获得Mac 地址 |
getRssi() | 获得802.11n 网络的信号 |
4.WifiManager
wifi连接统一管理类,获取WIFI网卡的状态(WIFI网卡的状态是由一系列的整形常量来表示的)
WIFI_STATE_DISABLING = 0 | WIFI网卡正在关闭 |
WIFI_STATE_DISABLED = 1 | WIFI网卡不可用 |
WIFI_STATE_ENABLING = 2 | WIFI网正在打开 (WIFI启动需要一段时间) |
WIFI_STATE_ENABLED = 3 | WIFI网卡可用 |
WIFI_STATE_UNKNOWN = 4 | 未知网卡状态 |
WIFI_AP_STATE_DISABLING = 10 | WIFI热点正在关闭 |
WIFI_AP_STATE_DISABLED = 11 | WIFI热点不可用 |
WIFI_AP_STATE_ENABLING = 12 | WIFI热点正在打开 |
WIFI_AP_STATE_ENABLED = 13 | WIFI热点可用 |
5. 在AndroidManifest.xml进行对WIFI操作的权限设置
<!-- 以下是使用wifi访问网络所需的权限 --><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管理工具类,我完善了一下,并加上了详细的注解,很实用的!
WifiAdmin类: (wifi管理工具类)
package com.zhf.wifidemo.wifi.utils; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Iterator; import java.util.List; import android.content.Context; import android.net.wifi.ScanResult; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; /*** WIFI管理类* @author ZHF**/ public class WifiAdmin {private static WifiAdmin wifiAdmin = null;private List<WifiConfiguration> mWifiConfiguration; //无线网络配置信息类集合(网络连接列表)private List<ScanResult> mWifiList; //检测到接入点信息类 集合//描述任何Wifi连接状态private WifiInfo mWifiInfo;WifiManager.WifiLock mWifilock; //能够阻止wifi进入睡眠状态,使wifi一直处于活跃状态public WifiManager mWifiManager;/*** 获取该类的实例(懒汉)* @param context* @return*/public static WifiAdmin getInstance(Context context) {if(wifiAdmin == null) {wifiAdmin = new WifiAdmin(context);return wifiAdmin;}return null;}private WifiAdmin(Context context) {//获取系统Wifi服务 WIFI_SERVICEthis.mWifiManager = (WifiManager) context.getSystemService("wifi");//获取连接信息this.mWifiInfo = this.mWifiManager.getConnectionInfo();}/*** 是否存在网络信息* @param str 热点名称* @return*/private WifiConfiguration isExsits(String str) {Iterator localIterator = this.mWifiManager.getConfiguredNetworks().iterator();WifiConfiguration localWifiConfiguration;do {if(!localIterator.hasNext()) return null;localWifiConfiguration = (WifiConfiguration) localIterator.next();}while(!localWifiConfiguration.SSID.equals("\"" + str + "\""));return localWifiConfiguration;}/**锁定WifiLock,当下载大文件时需要锁定 **/public void AcquireWifiLock() {this.mWifilock.acquire();}/**创建一个WifiLock**/public void CreateWifiLock() {this.mWifilock = this.mWifiManager.createWifiLock("Test");}/**解锁WifiLock**/public void ReleaseWifilock() {if(mWifilock.isHeld()) { //判断时候锁定 mWifilock.acquire();}}/**打开Wifi**/public void OpenWifi() {if(!this.mWifiManager.isWifiEnabled()){ //当前wifi不可用this.mWifiManager.setWifiEnabled(true);}}/**关闭Wifi**/public void closeWifi() {if(mWifiManager.isWifiEnabled()) {mWifiManager.setWifiEnabled(false);}}/**端口指定id的wifi**/public void disconnectWifi(int paramInt) {this.mWifiManager.disableNetwork(paramInt);}/**添加指定网络**/public void addNetwork(WifiConfiguration paramWifiConfiguration) {int i = mWifiManager.addNetwork(paramWifiConfiguration);mWifiManager.enableNetwork(i, true);}/*** 连接指定配置好的网络* @param index 配置好网络的ID*/public void connectConfiguration(int index) { // 索引大于配置好的网络索引返回 if (index > mWifiConfiguration.size()) { return; } //连接配置好的指定ID的网络 mWifiManager.enableNetwork(mWifiConfiguration.get(index).networkId, true); }/*** 根据wifi信息创建或关闭一个热点* @param paramWifiConfiguration* @param paramBoolean 关闭标志*/public void createWifiAP(WifiConfiguration paramWifiConfiguration,boolean paramBoolean) {try {Class localClass = this.mWifiManager.getClass();Class[] arrayOfClass = new Class[2];arrayOfClass[0] = WifiConfiguration.class;arrayOfClass[1] = Boolean.TYPE;Method localMethod = localClass.getMethod("setWifiApEnabled",arrayOfClass);WifiManager localWifiManager = this.mWifiManager;Object[] arrayOfObject = new Object[2];arrayOfObject[0] = paramWifiConfiguration;arrayOfObject[1] = Boolean.valueOf(paramBoolean);localMethod.invoke(localWifiManager, arrayOfObject);return;} catch (Exception e) {e.printStackTrace();}}/*** 创建一个wifi信息* @param ssid 名称* @param passawrd 密码* @param paramInt 有3个参数,1是无密码,2是简单密码,3是wap加密* @param type 是"ap"还是"wifi"* @return*/public WifiConfiguration createWifiInfo(String ssid, String passawrd,int paramInt, String type) {//配置网络信息类WifiConfiguration localWifiConfiguration1 = new WifiConfiguration();//设置配置网络属性 localWifiConfiguration1.allowedAuthAlgorithms.clear();localWifiConfiguration1.allowedGroupCiphers.clear();localWifiConfiguration1.allowedKeyManagement.clear();localWifiConfiguration1.allowedPairwiseCiphers.clear();localWifiConfiguration1.allowedProtocols.clear();if(type.equals("wt")) { //wifi连接localWifiConfiguration1.SSID = ("\"" + ssid + "\"");WifiConfiguration localWifiConfiguration2 = isExsits(ssid);if(localWifiConfiguration2 != null) {mWifiManager.removeNetwork(localWifiConfiguration2.networkId); //从列表中删除指定的网络配置网络 }if(paramInt == 1) { //没有密码localWifiConfiguration1.wepKeys[0] = "";localWifiConfiguration1.allowedKeyManagement.set(0);localWifiConfiguration1.wepTxKeyIndex = 0;} else if(paramInt == 2) { //简单密码localWifiConfiguration1.hiddenSSID = true;localWifiConfiguration1.wepKeys[0] = ("\"" + passawrd + "\"");} else { //wap加密localWifiConfiguration1.preSharedKey = ("\"" + passawrd + "\"");localWifiConfiguration1.hiddenSSID = true;localWifiConfiguration1.allowedAuthAlgorithms.set(0);localWifiConfiguration1.allowedGroupCiphers.set(2);localWifiConfiguration1.allowedKeyManagement.set(1);localWifiConfiguration1.allowedPairwiseCiphers.set(1);localWifiConfiguration1.allowedGroupCiphers.set(3);localWifiConfiguration1.allowedPairwiseCiphers.set(2);}}else {//"ap" wifi热点localWifiConfiguration1.SSID = ssid;localWifiConfiguration1.allowedAuthAlgorithms.set(1);localWifiConfiguration1.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);localWifiConfiguration1.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);localWifiConfiguration1.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);localWifiConfiguration1.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);localWifiConfiguration1.allowedKeyManagement.set(0);localWifiConfiguration1.wepTxKeyIndex = 0;if (paramInt == 1) { //没有密码localWifiConfiguration1.wepKeys[0] = "";localWifiConfiguration1.allowedKeyManagement.set(0);localWifiConfiguration1.wepTxKeyIndex = 0;} else if (paramInt == 2) { //简单密码localWifiConfiguration1.hiddenSSID = true;//网络上不广播ssidlocalWifiConfiguration1.wepKeys[0] = passawrd;} else if (paramInt == 3) {//wap加密localWifiConfiguration1.preSharedKey = passawrd;localWifiConfiguration1.allowedAuthAlgorithms.set(0);localWifiConfiguration1.allowedProtocols.set(1);localWifiConfiguration1.allowedProtocols.set(0);localWifiConfiguration1.allowedKeyManagement.set(1);localWifiConfiguration1.allowedPairwiseCiphers.set(2);localWifiConfiguration1.allowedPairwiseCiphers.set(1);}}return localWifiConfiguration1;}/**获取热点名**/public String getApSSID() {try {Method localMethod = this.mWifiManager.getClass().getDeclaredMethod("getWifiApConfiguration", new Class[0]);if (localMethod == null) return null;Object localObject1 = localMethod.invoke(this.mWifiManager,new Object[0]);if (localObject1 == null) return null;WifiConfiguration localWifiConfiguration = (WifiConfiguration) localObject1;if (localWifiConfiguration.SSID != null) return localWifiConfiguration.SSID;Field localField1 = WifiConfiguration.class .getDeclaredField("mWifiApProfile");if (localField1 == null) return null;localField1.setAccessible(true);Object localObject2 = localField1.get(localWifiConfiguration);localField1.setAccessible(false);if (localObject2 == null) return null;Field localField2 = localObject2.getClass().getDeclaredField("SSID");localField2.setAccessible(true);Object localObject3 = localField2.get(localObject2);if (localObject3 == null) return null;localField2.setAccessible(false);String str = (String) localObject3;return str;} catch (Exception localException) {}return null;}/**获取wifi名**/public String getBSSID() {if (this.mWifiInfo == null)return "NULL";return this.mWifiInfo.getBSSID();}/**得到配置好的网络 **/public List<WifiConfiguration> getConfiguration() {return this.mWifiConfiguration;}/**获取ip地址**/public int getIPAddress() {return (mWifiInfo == null) ? 0 : mWifiInfo.getIpAddress();}/**获取物理地址(Mac)**/public String getMacAddress() {return (mWifiInfo == null) ? "NULL" : mWifiInfo.getMacAddress();} /**获取网络id**/public int getNetworkId() {return (mWifiInfo == null) ? 0 : mWifiInfo.getNetworkId();}/**获取热点创建状态**/public int getWifiApState() {try {int i = ((Integer) this.mWifiManager.getClass().getMethod("getWifiApState", new Class[0]).invoke(this.mWifiManager, new Object[0])).intValue();return i;} catch (Exception localException) {}return 4; //未知wifi网卡状态 }/**获取wifi连接信息**/public WifiInfo getWifiInfo() {return this.mWifiManager.getConnectionInfo();}/** 得到网络列表**/public List<ScanResult> getWifiList() {return this.mWifiList;}/**查看扫描结果**/public StringBuilder lookUpScan() {StringBuilder localStringBuilder = new StringBuilder();for (int i = 0; i < mWifiList.size(); i++){localStringBuilder.append("Index_"+new Integer(i + 1).toString() + ":");//将ScanResult信息转换成一个字符串包//其中把包括:BSSID、SSID、capabilities、frequency、level localStringBuilder.append((mWifiList.get(i)).toString());localStringBuilder.append("\n");}return localStringBuilder;}/** 设置wifi搜索结果 **/public void setWifiList() {this.mWifiList = this.mWifiManager.getScanResults();}/**开始搜索wifi**/public void startScan() {this.mWifiManager.startScan();}/**得到接入点的BSSID**/public String GetBSSID() {return (mWifiInfo == null) ? "NULL" : mWifiInfo.getBSSID();} }