/**
*
* wifi管理类
*
*
*/
public class WifiOperator
{
/**
* wifiManager
*/
private WifiManager wm;
/**
* 上下文
*/
private Context mContext;
/**
* 数据库配置信息
*/
private NetworkConfigDbHelper configDBHelper;
/**
* <默认构造函数>
* @param context 上下文
*/
public WifiOperator(Context context)
{
mContext = context;
wm = (WifiManager)mContext.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
configDBHelper = new NetworkConfigDbHelper(context);
}
/**
* 切换网络
* @param type 网络类型(1为中心网络 2 为车载网络)
* @return 结果码 -1-本地设置为空;0-连接成功;1-已经为当前连接
* @see [类、类#方法、类#成员]
*/
public int access2Wifi(String type)
{
// 获取本地的网络配置信息
NetworkConfigBean setting = configDBHelper.getNetworkConfigBySettingType(type).get(type);
if (setting == null)
{
// 本地设置为空
return -1;
}
// 无线未打开时,开启无线
if (!wm.isWifiEnabled() && WifiManager.WIFI_STATE_ENABLING != wm.getWifiState())
{
wm.setWifiEnabled(true);
}
// 获取本地的配置信息
String sSSID = "\"" + setting.getSsid() + "\"";
String sKey = "\"" + setting.getPassword() + "\"";
int encryptionType = getKeyMgmtType(setting.getEncryptionType());
List configurations = wm.getConfiguredNetworks();
WifiConfiguration config = null;
boolean isExisted = false;
int networkId = -1;
for (int i = configurations.size() - 1; i >= 0; i--)
{
config = configurations.get(i);
if (config.SSID.equals(sSSID))
{
networkId = config.networkId;
isExisted = true;
break;
}
}
if (!isExisted)
{
// 安全类型 无、WEP(128)、WPA(TKIP)、WPA2(AES)
config = new WifiConfiguration();
// 名称
config.SSID = sSSID;
config.allowedKeyManagement.set(encryptionType);
if (encryptionType != 0)
{
// 密码
config.preSharedKey = sKey;
}
config.hiddenSSID = false;
config.priority = 30;
config.status = WifiConfiguration.Status.ENABLED;
config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.NONE);
config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
// 必须添加,否则无线路由无法连接
config.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
networkId = wm.addNetwork(config);
if (networkId != -1)
{
wm.saveConfiguration();
}
}
else
{
// 获取当前的wifi连接
WifiInfo curConnection = wm.getConnectionInfo();
if (curConnection != null && sSSID.equals(curConnection.getSSID()))
{
// 已经是当前连接
return 1;
}
config.allowedKeyManagement.set(encryptionType);
if (encryptionType != 0)
{
// 密码
config.preSharedKey = sKey;
}
wm.updateNetwork(config);
}
if (networkId != -1)
{
wm.disconnect();
wm.enableNetwork(networkId, true);
}
return 0;
}
/**
* 获取加密类型
* @param type 加密类型
* @return 加密类型
* @see [类、类#方法、类#成员]
*/
private int getKeyMgmtType(String type)
{
if (type == null)
{
return WifiConfiguration.KeyMgmt.NONE;
}
if ("WEP".equals(type))
{
return WifiConfiguration.KeyMgmt.IEEE8021X;
}
else if ("WPA-PSK".equals(type))
{
return WifiConfiguration.KeyMgmt.WPA_PSK;
}
else if ("WPA2-PSK".equals(type))
{
return WifiConfiguration.KeyMgmt.WPA_PSK;
}
return WifiConfiguration.KeyMgmt.NONE;
}
}
Android提供了android.net.wifi包供我们操作WiFi。首先介绍一下几个类:
WifiManager:提供了管理WiFI连接的大部分API
ScanResult:已经检测出的接入点(包括接入点的地址、名称、身份认证、频率、信号强度)
WifiConfiguration:WiFi连接的网络配置(包括安全配置等)
WifiInfo:WiFI无线连接的描述(包括接入点、网络连接状态、隐藏的接入点、IP地址、连接速度、MAC地址、网络ID、信号强度等等)
WifiManager.WifiLock:允许应用程序一直使用WiFI无线网络,通常情况下当用户在一段时间内没有任何操作的时候,WiFi网络会自动关闭。我们使用WifiLock来锁定WiFi网络,使其一直保持连接,直到这个锁被释放。多个应用程序可能有多个锁,当多有的应用程序的锁都被释放的时候,WiFi才被关闭。
下面我们通过代码理解WiFI的使用:
通过以下代码获得WifiManager对象(Wifi是系统的一项服务)
- WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
打开WiFIWifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
- public void openWifi() {
- if (!mWifiManager.isWifiEnabled()) {
- mWifiManager.setWifiEnabled(true);
- }
- }
关闭WiFipublic void openWifi() { if (!mWifiManager.isWifiEnabled()) { mWifiManager.setWifiEnabled(true); } }
- public void closeWifi() {
- if (!mWifiManager.isWifiEnabled()) {
- mWifiManager.setWifiEnabled(false);
- }
- }
创建一个WifiLockpublic void closeWifi() { if (!mWifiManager.isWifiEnabled()) { mWifiManager.setWifiEnabled(false); } }
- public void creatWifiLock() {
- mWifiLock = mWifiManager.createWifiLock("Test");
- }
锁定WifiLockpublic void creatWifiLock() { mWifiLock = mWifiManager.createWifiLock("Test"); }
- public void acquireWifiLock() {
- mWifiLock.acquire();
- }
释放WifiLockpublic void acquireWifiLock() { mWifiLock.acquire(); }
- public void releaseWifiLock() {
- if (mWifiLock.isHeld()) {
- mWifiLock.release();
- }
- }
添加一个WiFi并连接public void releaseWifiLock() { if (mWifiLock.isHeld()) { mWifiLock.release(); } }
- public void addNetworkAndConn(WifiConfiguration wcg) {
- int netId = mWifiManager.addNetwork(wcg);
- mWifiManager.enableNetwork(netId, true);
- }
断开一个指定ID的WiFipublic void addNetworkAndConn(WifiConfiguration wcg) { int netId = mWifiManager.addNetwork(wcg); mWifiManager.enableNetwork(netId, true); }
- public void disconnectWifi(int netId) {
- mWifiManager.disableNetwork(netId);
- mWifiManager.disconnect();
- }
连接到一个已经配置好了的WiFipublic void disconnectWifi(int netId) { mWifiManager.disableNetwork(netId); mWifiManager.disconnect(); }
- public void connectConfiguration(int index) {
- // 索引大于配置好的网络索引返回
- if (index > mWifiConfiguration.size()) {
- return;
- }
- mWifiManager.enableNetwork(mWifiConfiguration.get(index).networkId,
- true);
- }
public void connectConfiguration(int index) { // 索引大于配置好的网络索引返回 if (index > mWifiConfiguration.size()) { return; } mWifiManager.enableNetwork(mWifiConfiguration.get(index).networkId, true); }
扫描可接入的WiFi
- public void startScan() {
- mWifiManager.startScan();
- // 得到扫描结果
- List
wifiList = mWifiManager.getScanResults(); - // 得到配置好的网络连接
- List
wifiConfigList = mWifiManager.getConfiguredNetworks(); - }
查看扫描结果public void startScan() { mWifiManager.startScan(); // 得到扫描结果 List
wifiList = mWifiManager.getScanResults(); // 得到配置好的网络连接 List wifiConfigList = mWifiManager.getConfiguredNetworks(); }
- public StringBuilder lookUpScan() {
- StringBuilder stringBuilder = new StringBuilder();
- for (int i = 0; i < mWifiList.size(); i++) {
- stringBuilder
- .append("Index_" + new Integer(i + 1).toString() + ":");
- // 将ScanResult信息转换成一个字符串包
- // 其中把包括:BSSID、SSID、capabilities、frequency、level
- stringBuilder.append((mWifiList.get(i)).toString());
- stringBuilder.append("\n");
- }
- return stringBuilder;
- }
得到WiFi的一些信息public StringBuilder lookUpScan() { StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < mWifiList.size(); i++) { stringBuilder .append("Index_" + new Integer(i + 1).toString() + ":"); // 将ScanResult信息转换成一个字符串包 // 其中把包括:BSSID、SSID、capabilities、frequency、level stringBuilder.append((mWifiList.get(i)).toString()); stringBuilder.append("\n"); } return stringBuilder; }
- WifiInfo mifiInfo = mWifiManager.getConnectionInfo();
- // 得到MAC地址
- public String GetMacAddress() {
- return (mWifiInfo == null) ? "NULL" : mWifiInfo.getMacAddress();
- }
- // 得到接入点的BSSID
- public String GetBSSID() {
- return (mWifiInfo == null) ? "NULL" : mWifiInfo.getBSSID();
- }
- // 得到IP地址
- public int GetIPAddress() {
- return (mWifiInfo == null) ? 0 : mWifiInfo.getIpAddress();
- }
- // 得到连接的ID
- public int GetNetworkId() {
- return (mWifiInfo == null) ? 0 : mWifiInfo.getNetworkId();
- }
- // 得到WifiInfo的所有信息包
- public String GetWifiInfo() {
- return (mWifiInfo == null) ? "NULL" : mWifiInfo.toString();
- }
WifiInfo mifiInfo = mWifiManager.getConnectionInfo(); // 得到MAC地址 public String GetMacAddress() { return (mWifiInfo == null) ? "NULL" : mWifiInfo.getMacAddress(); } // 得到接入点的BSSID public String GetBSSID() { return (mWifiInfo == null) ? "NULL" : mWifiInfo.getBSSID(); } // 得到IP地址 public int GetIPAddress() { return (mWifiInfo == null) ? 0 : mWifiInfo.getIpAddress(); } // 得到连接的ID public int GetNetworkId() { return (mWifiInfo == null) ? 0 : mWifiInfo.getNetworkId(); } // 得到WifiInfo的所有信息包 public String GetWifiInfo() { return (mWifiInfo == null) ? "NULL" : mWifiInfo.toString(); }
最后,使用WiFi必须添加的权限
- <uses-permission android:name="android.permission.ACCESS_WIFI_STATE">uses-permission>
- <uses-permission android:name="android.permission.ACCESS_CHECKIN_PROPERTIES">uses-permission>
- <uses-permission android:name="android.permission.WAKE_LOCK">uses-permission>
- <uses-permission android:name="android.permission.INTERNET">uses-permission>
- <uses-permission android:name="android.permission.CHANGE_WIFI_STATE">uses-permission>
- <uses-permission android:name="android.permission.MODIFY_PHONE_STATE">uses-permission>