源码地址在这里在这里!!!!!master分支哈

文章目录

  • 1 遇到困难
  • 2 源代码
    • 2.1 IWifiConnectListener.java
    • 2.2 IWifiDisConnectListener.java
    • 2.3 IWifiManager.java
    • 2.4 WifiConnector.java
    • 2.5 WifiManagerProxy.java
    • 2.6 MainActivity.java

1 遇到困难

面向谷歌搜索了很多博客,基本上都是失效的,只要你的compileSdkVersion版本高于28在Android 10设备上就无法连接wifi,虽然提示你是连接成功了但是实际上信号一直不可用。

解决办法目前只有这个:

 compileSdkVersion 28    // 版本号降到28或者更低

我们考虑整个WIFI自动连接过程会遇到哪些情况哈?

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();  //打开Wifivoid openWifiSettingPage(Activity activity); //打开wifi设置页面void closeWifi(); //关闭wifiboolean isWifiEnabled(); //判断wifi是否可用void connect(String ssId, String pwd, IWifiConnectListener iWifiLogListener); //连接wifivoid disConnect(String ssId,IWifiDisConnectListener listener); // 断开某个网络
}

2.4 WifiConnector.java

private IWifiConnectListener iWifiConnectListener;private WifiManager wifiManager;private Handler mHandler = new Handler(Looper.getMainLooper()) {@Overridepublic 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<WifiConfiguration> 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;// nopassif (Type == WifiCipherType.WIFICIPHER_NOPASS) {// config.wepKeys[0] = "";config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);// config.wepTxKeyIndex = 0;} else if (Type == WifiCipherType.WIFICIPHER_WEP) {// wepif (!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) {// wpaconfig.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;}@Overridepublic 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<ScanResult> scanResults = wifiManager.getScanResults();for (int i = 0; i < scanResults.size(); i++) {ScanResult scanResult = scanResults.get(i);if (TextUtils.equals(scanResult.SSID, ssid)) {hasSsIdWifi = true;break;}}// 如果就没这个wifi的话直接返回if (!hasSsIdWifi) {sendErrorMsg("当前不存在指定的Wifi!");return;}//禁掉所有wififor (WifiConfiguration c : wifiManager.getConfiguredNetworks()) {wifiManager.disableNetwork(c.networkId);}//看看当前wifi之前配置过没有boolean enabled = false;WifiConfiguration tempConfig = isExsits(ssid);if (tempConfig != null) {enabled = wifiManager.enableNetwork(tempConfig.networkId, true);} else {WifiConfiguration wifiConfig = createWifiInfo(ssid, password, type);if (wifiConfig == null) {sendErrorMsg("wifiConfig is null!");return;}int netID = wifiManager.addNetwork(wifiConfig);enabled = wifiManager.enableNetwork(netID, true);}if (enabled) {sendSuccessMsg("连接成功! enabled = " + enabled);} else {sendErrorMsg("连接失败! enabled = false");}} catch (Exception e) {sendErrorMsg(e.getMessage());e.printStackTrace();}}}private boolean isHexWepKey(String wepKey) {final int len = wepKey.length();// WEP-40, WEP-104, and some vendors using 256-bit WEP (WEP-232?)if (len != 10 && len != 26 && len != 58) {return false;}return isHex(wepKey);}private boolean isHex(String key) {for (int i = key.length() - 1; i >= 0; i--) {final char c = key.charAt(i);if (!(c >= '0' && c <= '9' || c >= 'A' && c <= 'F' || c >= 'a'&& c <= 'f')) {return false;}}return true;}

2.5 WifiManagerProxy.java

private static class SingletonHolder {private static final WifiManagerProxy INSTANCE = new WifiManagerProxy();}private WifiManagerProxy() {}public static WifiManagerProxy get() {return SingletonHolder.INSTANCE;}private WifiManager manager;private WifiConnector mConnector = new WifiConnector();private void checkInit() {if (manager == null) {throw new IllegalArgumentException("You must call init()  before other methods!");}}@Overridepublic void init(Application application) {if (application == null) {throw new IllegalArgumentException("Application cant be null!");}if (manager == null) {manager = (WifiManager) application.getSystemService(Context.WIFI_SERVICE);mConnector.init(manager);}}@Overridepublic void openWifi() {checkInit();if (!isWifiEnabled()) {manager.setWifiEnabled(true);}}@Overridepublic void openWifiSettingPage(Activity activity) {checkInit();if (activity == null) {return;}activity.startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS));}@Overridepublic void closeWifi() {checkInit();if (isWifiEnabled()) {manager.setWifiEnabled(false);}}@Overridepublic boolean isWifiEnabled() {checkInit();return manager.isWifiEnabled();}@Overridepublic void connect(String ssId, String pwd, IWifiConnectListener listener) {checkInit();if (listener == null) {throw new IllegalArgumentException(" IWifiConnectListener cant be null !");}mConnector.connect(ssId, pwd, WifiConnector.WifiCipherType.WIFICIPHER_WPA, listener);}@Overridepublic void disConnect(String ssId, IWifiDisConnectListener listener) {checkInit();if (listener == null) {throw new IllegalArgumentException(" IWifiDisConnectListener cant be null !");}if (TextUtils.isEmpty(ssId)) {listener.onDisConnectFail(" WIFI名称不能为空! ");return;}ssId = "\"" + ssId + "\"";WifiInfo wifiInfo = manager.getConnectionInfo();if (wifiInfo != null && !TextUtils.isEmpty(ssId) && TextUtils.equals(ssId, wifiInfo.getSSID())) {int netId = wifiInfo.getNetworkId();manager.disableNetwork(netId);listener.onDisConnectSuccess();} else {listener.onDisConnectFail(" wifi状态异常 或者 此时就没有连接上对应的WIFI ! ");}}

2.6 MainActivity.java


public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);test();}private void test() {WifiManagerProxy.get().init(getApplication());WifiManagerProxy.get().connect("xxx", "xxx", new IWifiConnectListener() {@Overridepublic void onConnectStart() {Log.i("TAG", "onConnectStart: ");}@Overridepublic void onConnectSuccess() {Log.i("TAG", "onConnectSuccess: ");}@Overridepublic void onConnectFail(String errorMsg) {Log.i("TAG", "onConnectFail: " + errorMsg);}});}}

Android 根据账号和密码自动连接 WIFI (兼容Android 10)相关推荐

  1. Android 10自动连接WiFi问题 Android 10 断开WiFi问题

    说明:本文主要说明扫码之后自动连接WiFi的一些处理,扫码的流程相对简单,网上教程也比较多,对于目前Android各个版本也没有太多变化. 问题描述:最近在做项目的时候,发现以前的项目有扫描二维码自动 ...

  2. iOS App无需跳转系统设置自动连接Wi-Fi

    一: 介绍 近几年,智能设备越来越火,这些智能设备中,有很大一部分是通过手机来控制硬件设备,来达到预期的效果,这中间少不了要使用到蓝牙功能,通过蓝牙来通信来控制设备. 除了蓝牙控制设备之外,还可以通过 ...

  3. 树莓派开机自动连接WIFI直接VNC连接界面

    对于没有Linux开发经验的新手来说,入手树莓派肯定是有一定的难度,对于我来说,把我走过得弯路,入过的坑,填平. 我接下来的讲述都是基于树莓派4B的4G版本,不带屏幕开发. 我的树莓派装的系统如下图: ...

  4. 树莓派配置自动连接wifi,ip自动发送到163邮箱

    实际环境: 在普通场景下我们是无法登陆路由器管理界面查看树莓派ip的,我们该怎么办呢,方法是有的,先让树莓派连接我的手机热点,查看树莓派的mac地址,得到mac地址后再让树莓派连接本地wifi,我们笔 ...

  5. archlinux 开机自动连接wifi

    archlinux 开机自动连接wifi archlinux 开机后连接wifi很简单 利用wifi-menu命令就可以选择热点和输入密码 但是重启后又要再来一次. 如果安装了gui, 当然可以利用N ...

  6. html5 自动连接wifi,怎么设置自动切换wifi 点击右上角的【高级设置】

    怎么停止手机WIFI自动切换 安卓手机设置禁止自动连接WiFi的方法: 在此以"小米4"手机为例,打开手机"设置"界面,点击"WLAN"项进 ...

  7. TQ2440 mifi驱动及开机自动连接wifi全过程

    想让你的 ARM 也能上网吗?那么请跟我来: 前期准备:买一个小米wifi(淘宝直接搜) 下载linux2.6.30:已共享到我的网盘: http://pan.baidu.com/s/1kUbhoGZ ...

  8. 树莓派安装raspberry os,两种方式连接树莓派,并设置静态ip开机自动连接WiFi

    Step1 在win10通过[DiskGenius]软件格式化原有的sd卡并删除原有的分区,最后将所有空间新建成一个分区,这样win10就能重新识别这个大存储器. 下面通过[Win32DiskImag ...

  9. java代码实现在Windows中自动连接WiFi(乞丐版)

    之前在学校用校园网时每次开机自己都要连接WiFi然后手动登入校园账号,频繁的登入使我萌生了能不能用代码来完成这些操作.说动手就动手,但现在暑假不在学校无法查看校园登入的一些参数,于是打算先实现自动连接 ...

最新文章

  1. 【python gensim使用】word2vec词向量处理中文语料
  2. iOS - Flutter混合开发
  3. 2021年古蔺高考成绩查询,古蔺中学2021录取分数线
  4. 零售购物中心学习__2018年07月16日
  5. RT-Thread的I/O设备模块及其驱动实现步骤
  6. RESTful Web Service
  7. linux系统软件包依赖关系,Ubuntu解决包依赖关系
  8. [CMake] message 打印变量值
  9. mysql 联合查询_MySQL联合查询
  10. Leetcode题目解答汇总
  11. 数据库系统概论(第五版) 王珊 第一章课后习题答案
  12. 国内最新可用Google谷歌镜像网站入口网站网址
  13. Windows Phone 7 日历应用的实现
  14. 【转载】52nlp博客上的资源
  15. Mybatis的灵活运用及注意事项
  16. 上火了该如何是好 五招让你轻松消火
  17. 使用echart的小指南
  18. Ubuntu系统如何搜索要安装的软件包
  19. OPPOA79K_OPPOA79KT_官方线刷包_救砖包_解账户锁
  20. 一台双u的服务器和一台单u的服务器性能能高一半吗,单机柜供电能力提升后,选择1U还是2U?...

热门文章

  1. struts2漏洞监测_全版本struts2漏洞练习
  2. 计算机里创建本地磁盘分区,韩博士教你怎么用本地模式将电脑磁盘分区
  3. Symbian和C++ SDK入门之开发工具(转)
  4. 解密中国互联网构成与发展
  5. java采集温湿度水浸_建大仁科485型模块二次开发说明
  6. RNA-seq数据下载
  7. 机器人工程相关课程共性问题的思考-2022-
  8. 职业规划,什么才是核心竞争力?
  9. HDFS追加文件内容和覆盖文件的命令示例
  10. WPS PDF文档如何取消高亮