源码地址在这里在这里!!!!!master分支哈
文章目录
1 遇到困难2 源代码2.1 IWifiConnectListener.java2.2 IWifiDisConnectListener.java2.3 IWifiManager.java2.4 WifiConnector.java2.5 WifiManagerProxy.java2.6 MainActivity.java
1 遇到困难
面向谷歌搜索了很多博客,基本上都是失效的,只要你的compileSdkVersion版本高于28在Android 10设备上就无法连接wifi,虽然提示你是连接成功了但是实际上信号一直不可用。
解决办法目前只有这个:
compileSdkVersion 28 // 版本号降到28或者更低
我们考虑整个WIFI自动连接过程会遇到哪些情况哈?
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210515151101442.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xvc2luZ0NhcnJ5Smll,size_16,color_FFFFFF,t_70)
2 源代码
2.1 IWifiConnectListener.java
public interface IWifiConnectListener {
//开始连接
void onConnectStart();
// 连接成功
void onConnectSuccess();
//连接失败
void onConnectFail(String errorMsg);
}
2.2 IWifiDisConnectListener.java
public interface IWifiDisConnectListener {
//断开成功
void onDisConnectSuccess();
//断开失败
void onDisConnectFail(String errorMsg);
}
2.3 IWifiManager.java
public interface IWifiManager {
void init(Application application);
void openWifi(); //打开Wifi
void openWifiSettingPage(Activity activity); //打开wifi设置页面
void closeWifi(); //关闭wifi
boolean isWifiEnabled(); //判断wifi是否可用
void connect(String ssId, String pwd, IWifiConnectListener iWifiLogListener); //连接wifi
void disConnect(String ssId,IWifiDisConnectListener listener); // 断开某个网络
}
2.4 WifiConnector.java
private IWifiConnectListener iWifiConnectListener;
private WifiManager wifiManager;
private Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (iWifiConnectListener != null) {
switch (msg.what) {
case 0:
iWifiConnectListener.onConnectSuccess();
break;
case -1:
iWifiConnectListener.onConnectFail(" fail = " + msg.obj);
break;
default:
break;
}
}
}
};
public void init(WifiManager wifiManager) {
if (wifiManager == null) {
throw new IllegalArgumentException("WifiConnector wifiManager cant be null!");
}
this.wifiManager = wifiManager;
}
private void checkInit() {
if (wifiManager == null) {
throw new IllegalArgumentException("You must call init() before other methods!");
}
if (iWifiConnectListener == null) {
throw new IllegalArgumentException("IWifiConnectListener cant be null!");
}
}
/**
* 子线程要向UI发送连接失败的消息
*
* @param info 消息
*/
public void sendErrorMsg(String info) {
if (mHandler != null) {
Message msg = new Message();
msg.obj = info;
msg.what = -1;
mHandler.sendMessage(msg);// 向Handler发送消息
}
}
/**
* 子线程向UI主线程发送连接成功的消息
*
* @param info
*/
public void sendSuccessMsg(String info) {
if (mHandler != null) {
Message msg = new Message();
msg.obj = info;
msg.what = 0;
mHandler.sendMessage(msg);// 向Handler发送消息
}
}
//WIFICIPHER_WEP是WEP ,WIFICIPHER_WPA是WPA,WIFICIPHER_NOPASS没有密码
public enum WifiCipherType {
WIFICIPHER_WEP, WIFICIPHER_WPA, WIFICIPHER_NOPASS, WIFICIPHER_INVALID
}
// 提供一个外部接口,传入要连接的无线网
public void connect(String ssid, String password, WifiCipherType type, IWifiConnectListener listener) {
this.iWifiConnectListener = listener;
Thread thread = new Thread(new ConnectRunnable(ssid, password, type));
thread.start();
}
// 查看以前是否也配置过这个网络
public WifiConfiguration isExsits(String SSID) {
List existingConfigs = wifiManager
.getConfiguredNetworks();
for (WifiConfiguration existingConfig : existingConfigs) {
if (existingConfig.SSID.equals("\"" + SSID + "\"")) {
return existingConfig;
}
}
return null;
}
public WifiConfiguration createWifiInfo(String SSID, String Password, WifiCipherType Type) {
WifiConfiguration config = new WifiConfiguration();
config.allowedAuthAlgorithms.clear();
config.allowedGroupCiphers.clear();
config.allowedKeyManagement.clear();
config.allowedPairwiseCiphers.clear();
config.allowedProtocols.clear();
config.SSID = "\"" + SSID + "\"";
// config.SSID = SSID;
// nopass
if (Type == WifiCipherType.WIFICIPHER_NOPASS) {
// config.wepKeys[0] = "";
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
// config.wepTxKeyIndex = 0;
} else if (Type == WifiCipherType.WIFICIPHER_WEP) {// wep
if (!TextUtils.isEmpty(Password)) {
if (isHexWepKey(Password)) {
config.wepKeys[0] = Password;
} else {
config.wepKeys[0] = "\"" + Password + "\"";
}
}
config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
config.wepTxKeyIndex = 0;
} else if (Type == WifiCipherType.WIFICIPHER_WPA) {// wpa
config.preSharedKey = "\"" + Password + "\"";
config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
config.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
config.status = WifiConfiguration.Status.ENABLED;
}
return config;
}
// 打开wifi功能
private boolean openWifi() {
checkInit();
boolean bRet = true;
if (!wifiManager.isWifiEnabled()) {
bRet = wifiManager.setWifiEnabled(true);
}
return bRet;
}
class ConnectRunnable implements Runnable {
private String ssid;
private String password;
private WifiCipherType type;
public ConnectRunnable(String ssid, String password, WifiCipherType type) {
this.ssid = ssid;
this.password = password;
this.type = type;
}
@Override
public void run() {
checkInit();
try {
// 如果之前没打开wifi,就去打开 确保wifi开关开了
openWifi();
iWifiConnectListener.onConnectStart();
//开启wifi需要等系统wifi刷新1秒的时间
Thread.sleep(1000);
// 如果wifi没开启的话就提示错误
if (wifiManager.getWifiState() == WifiManager.WIFI_STATE_DISABLED) {
sendErrorMsg("WIFI 未开启");
return;
}
// 开启wifi之后开始扫描附近的wifi列表
wifiManager.startScan();
Thread.sleep(500);
boolean hasSsIdWifi = false;
List scanResults = wifiManager.getScanResults();
for (int i = 0; i = 0; i--) {
final char c = key.charAt(i);
if (!(c >= '0' && c = 'A' && c = 'a'
&& c |