下面是 Android 开发中 WiFi 的常用配置,如:获取当前 WiFi ,扫描 WiFi 获取列表,连接指定 WiFi ,监听网络变化等等。
下面是效果图:
GitHub 下载地址:https://github.com/wuqingsen/WifiDemoWu
csdn 下载地址 :https://download.csdn.net/download/wuqingsen1/11687828
下面来看一下具体的方法使用:
使用前先加入权限:
获取 WifiManager :
WifiManager mWifiManager = (WifiManager)mContext.getApplicationContext().getSystemService(mContext.WIFI_SERVICE);
获取 WiFi 列表 :
/**
* 获取wifi列表
*/
public static List getWifiList(WifiManager mWifiManager) {
return mWifiManager.getScanResults();
}
开始扫描 WiFi :
/**
* 开始扫描wifi
*/
public static void startScanWifi(WifiManager manager) {
if (manager != null) {
manager.startScan();
}
}
保存网络 :
/**
* 保存网络
*/
public static void saveNetworkByConfig(WifiManager manager, WifiConfiguration config) {
if (manager == null) {
return;
}
try {
Method save = manager.getClass().getDeclaredMethod("save", WifiConfiguration.class, Class.forName("android.net.wifi.WifiManager$ActionListener"));
if (save != null) {
save.setAccessible(true);
save.invoke(manager, config, null);
}
} catch (Exception e) {
e.printStackTrace();
}
}
忘记网络:
/**
* 忘记网络
*/
public static void forgetNetwork(WifiManager manager, int networkId) {
if (manager == null) {
return;
}
try {
Method forget = manager.getClass().getDeclaredMethod("forget", int.class, Class.forName("android.net.wifi.WifiManager$ActionListener"));
if (forget != null) {
forget.setAccessible(true);
forget.invoke(manager, networkId, null);
}
} catch (Exception e) {
e.printStackTrace();
}
}
断开连接:
/**
* 断开连接
*/
public static boolean disconnectNetwork(WifiManager manager) {
return manager != null && manager.disconnect();
}
获取当前 WiFi 名字 :
/**
* 获取当前wifi名字
* @return
*/
public static String getWiFiName(WifiManager manager) {
WifiInfo wifiInfo = manager.getConnectionInfo();
return wifiInfo.getSSID();
}
获取 WiFi 加密方式:
/**
* 获取wifi加密方式
*/
public static String getEncrypt(WifiManager mWifiManager, ScanResult scanResult) {
if (mWifiManager != null) {
String capabilities = scanResult.capabilities;
if (!TextUtils.isEmpty(capabilities)) {
if (capabilities.contains("WPA") || capabilities.contains("wpa")) {
return "WPA";
} else if (capabilities.contains("WEP") || capabilities.contains("wep")) {
return "WEP";
} else {
return "没密码";
}
}
}
return "获取失败";
}
检查是否开启 WiFi 并打开 WiFi :
/**
* 是否开启wifi,没有的话打开wifi
*/
public static boolean openWifi(WifiManager mWifiManager) {
boolean bRet = true;
if (!mWifiManager.isWifiEnabled()) {
bRet = mWifiManager.setWifiEnabled(true);
}
return bRet;
}
连接指定 WiFi:
/**
* 连接WiFi
* @param wifiManager
* @param wifiName
* @param password
* @param type
*/
@SuppressLint("WifiManagerLeak")
public static void connectWifi(WifiManager wifiManager, String wifiName, String password, String type) {
// 1、注意热点和密码均包含引号,此处需要需要转义引号
String ssid = "\"" + wifiName + "\"";
String psd = "\"" + password + "\"";
//2、配置wifi信息
WifiConfiguration conf = new WifiConfiguration();
conf.SSID = ssid;
switch (type) {
case "WEP":
// 加密类型为WEP
conf.wepKeys[0] = psd;
conf.wepTxKeyIndex = 0;
conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
break;
case "WPA":
// 加密类型为WPA
conf.preSharedKey = psd;
break;
default:
//无密码
conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
}
//3、链接wifi
wifiManager.addNetwork(conf);
List list = wifiManager.getConfiguredNetworks();
for (WifiConfiguration i : list) {
if (i.SSID != null && i.SSID.equals(ssid)) {
wifiManager.disconnect();
wifiManager.enableNetwork(i.networkId, true);
wifiManager.reconnect();
break;
}
}
}
WiFi 状态监听:
private WifiBroadcastReceiver wifiReceiver;
//监听wifi变化
private void registerReceiverWifi() {
wifiReceiver = new WifiBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);//监听wifi是开关变化的状态
filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);//监听wifi连接状态
filter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);//监听wifi列表变化(开启一个热点或者关闭一个热点)
registerReceiver(wifiReceiver, filter);
}
//监听wifi状态广播接收器
public class WifiBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(intent.getAction())) {
//wifi开关变化
int state = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0);
switch (state) {
case WifiManager.WIFI_STATE_DISABLED: {
//wifi关闭
Log.e("=====", "已经关闭");
tv_wifiState.append("\n 打开变化:wifi已经关闭");
break;
}
case WifiManager.WIFI_STATE_DISABLING: {
//wifi正在关闭
Log.e("=====", "正在关闭");
tv_wifiState.append("\n 打开变化:wifi正在关闭");
break;
}
case WifiManager.WIFI_STATE_ENABLED: {
//wifi已经打开
Log.e("=====", "已经打开");
tv_wifiState.append("\n 打开变化:wifi已经打开");
break;
}
case WifiManager.WIFI_STATE_ENABLING: {
//wifi正在打开
Log.e("=====", "正在打开");
tv_wifiState.append("\n 打开变化:wifi正在打开");
break;
}
case WifiManager.WIFI_STATE_UNKNOWN: {
//未知
Log.e("=====", "未知状态");
tv_wifiState.append("\n 打开变化:wifi未知状态");
break;
}
}
} else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(intent.getAction())) {
//监听wifi连接状态
NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
Log.e("=====", "--NetworkInfo--" + info.toString());
if (NetworkInfo.State.DISCONNECTED == info.getState()) {//wifi没连接上
Log.e("=====", "wifi没连接上");
tv_wifiState.append("\n 连接状态:wifi没连接上");
} else if (NetworkInfo.State.CONNECTED == info.getState()) {//wifi连接上了
Log.e("=====", "wifi以连接");
tv_wifiState.append("\n 连接状态:wifi以连接,wifi名称:" + MyWifiManager.getWiFiName(mWifiManager));
} else if (NetworkInfo.State.CONNECTING == info.getState()) {//正在连接
Log.e("=====", "wifi正在连接");
tv_wifiState.append("\n 连接状态:wifi正在连接");
}
} else if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(intent.getAction())) {
//监听wifi列表变化
Log.e("=====", "wifi列表发生变化");
}
}
}
开启 WiFi ,关闭 WiFi 方法:
/**
* 开启wifi
*/
public void openWifi(WifiManager mWifiManager) {
if (!mWifiManager.isWifiEnabled()) {
mWifiManager.setWifiEnabled(true);
}
}
/**
* 关闭wifi
*/
public void closeWifi(WifiManager mWifiManager) {
if (mWifiManager.isWifiEnabled()) {
mWifiManager.setWifiEnabled(false);
}
}
可以在最上面下载 demo 看具体使用方法。