<span style="background-color: rgb(255, 255, 255); font-family: Arial, Helvetica, sans-serif;">Android提供了android.net.wifi包供我们操作Wifi。首先介绍一下包里面的几个类:</span>
WifiManager:提供了管理Wifi连接的大部分API
ScanResult:已检测出的接入点(包括接入点的地址、名称、身份认证、频率、信号强度)
WiFiConfiguration:Wifi连接的网络配置
WifiInfo:已连接上的无线连接服务(包括接入点、网络连接状态、隐藏的接入点、IP地址等等)
WifiManager.WifiLock:允许应用程序一直使用Wifi无线网络,使网络一直保持活动状态,例如在下载大文件。
Wifi的使用:
<span style="white-space:pre"> </span>WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);<pre name="code" class="java"><span style="white-space:pre"> </span>if(!this.mWifiManager.isWifiEnabled()){ //当前wifi不可用
<span style="white-space:pre"> </span>this.mWifiManager.setWifiEnabled(true);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>wifiManager.scanResults();
<span style="white-space:pre"> List<ScanResult> </span> list = wifiManager.getScanResults();
获取检测到的Wifi信息,选择其中一wifi进行连接。
int i = wifiManager.addNetwork(paramWifiConfiguration);
wifiManager.enableNetwork(i, true);
获取已连接Wifi的详细信息。
<span style="white-space:pre"> </span>WifiInfo info = ((WifiManager)getSystemService(WIFI_SERVICE)).getConnectionInfo();
mIconWifi.setImageLevel(Math.abs(info.getRssi()));
/*
info.getBSSID(); 获取BSSID地址。
info.getSSID(); 获取SSID地址。 需要连接网络的ID
info.getIpAddress(); 获取IP地址。4字节Int, XXX.XXX.XXX.XXX 每个XXX为一个字节
info.getMacAddress(); 获取MAC地址。
info.getNetworkId(); 获取网络ID。
info.getLinkSpeed(); 获取连接速度,可以让用户获知这一信息。
info.getRssi(); 获取RSSI,RSSI就是接受信号强度指示
*/
int Ip = info.getIpAddress();
String strIp = "" + (Ip & 0xFF) + "." + ((Ip >> 8) & 0xFF) + "." + ((Ip >> 16) & 0xFF) + "." + ((Ip >> 24) & 0xFF);
mLabelWifi.setText("BSSID : " + info.getBSSID() + "\nSSID : " + info.getSSID() +
"\nIpAddress : " + strIp + "\nMacAddress : " + info.getMacAddress() +
"\nNetworkId : " + info.getNetworkId() + "\nLinkSpeed : " + info.getLinkSpeed() + "Mbps" +
"\nRssi : " + info.getRssi());
info.getIpAddress();
设置Wifi AP热点:
首先需要开启Wifi热点。WifiManager.setWifiApEnabled是隐藏方法,不对外开发,所以需要应用反射技术来实现。
<span style="white-space:pre"> </span>Method setupMethod = wifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
WifiConfiguration netConfig = new WifiConfiguration();
// 设置wifi热点名称
netConfig.SSID = name;
netConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
netConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
netConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
netConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
netConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
netConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
netConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
if (password != null) {
if (password.length() < 8) {
throw new Exception("the length of wifi password must be 8 or longer");
}
// 设置wifi热点密码
netConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
netConfig.preSharedKey = password;
}
setupMethod.invoke(wifiManager, netConfig, true);
开启并设置wifi热点,WifiConfiguration一些参数的说明:
SSID:唯一标识wifi
preSharedKey:WIfi密码
hiddenSSID:是否隐藏SSID,确保Wifi安全
allowedAuthAlgorithms:wifi用户认证
allowedGroupCiphers:加密方式,组加密,默认值"WEP40", "WEP104", "TKIP", "CCMP"
allowedPairwiseCiphers:加密方式,成对加密,默认值"TKIP", "CCMP"
allowedKeyManagement:安全方式,"WPA_PSK", "WPA_EAP", "IEEE8021X", "WPA2_PSK"
status:状态