知道Wi-Fi名称和密码之后自动连接
这里写自定义目录标题
- 有Wi-Fi名称和密码自动连接Wi-Fi
- 主Activity
- 服务类 WIFIStateReceiver
- 工具类 WIFIConnectionManager
有Wi-Fi名称和密码自动连接Wi-Fi
主Activity
public class MainActivity extends AppCompatActivity implements View.OnClickListener{private static final String TAG = MainActivity.class.getName();private EditText mEtAccount;private EditText mEtPwd;private WIFIStateReceiver mWIFIStateReceiver;private Button mBtnAuto;private Button mBtnDisconnect;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();initData();initEvent();}private void initEvent() {mBtnAuto.setOnClickListener(this);mBtnDisconnect.setOnClickListener(this);}private void initData() {}private void initView() {mEtAccount = findViewById(R.id.et_account);mEtPwd = findViewById(R.id.et_pwd);mBtnAuto = findViewById(R.id.btn_auto);mBtnDisconnect = findViewById(R.id.btn_disconnect);}@Overrideprotected void onDestroy() {super.onDestroy();unregisterReceiver(mWIFIStateReceiver);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btn_auto: {if (mWIFIStateReceiver == null) {mWIFIStateReceiver = new WIFIStateReceiver(MainActivity.this);registerReceiver(mWIFIStateReceiver, new IntentFilter(WifiManager.NETWORK_STATE_CHANGED_ACTION));WIFIAutoConnectionService.start(this,mEtAccount.getText().toString().trim(),mEtPwd.getText().toString().trim());}}break;case R.id.btn_disconnect: {WIFIConnectionManager.getInstance(this).disconnect();WIFIConnectionManager.getInstance(this).closeWifi();}break;}}
}
服务类 WIFIStateReceiver
public class WIFIStateReceiver extends BroadcastReceiver {private static final String TAG = WIFIStateReceiver.class.getName();private Context mContext;List<ScanResult> scanResults;public WIFIStateReceiver(Context context) {this.mContext = context;}@Overridepublic void onReceive(Context context, Intent intent) {if (!intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {return;}scanResults = WIFIConnectionManager.getInstance(mContext).getWifiManager().getScanResults();for (int i = 0 ; i < scanResults.size();i++) {Log.e(TAG,"scanResults:----"+(scanResults.get(i)).SSID);}if (!WIFIConnectionManager.getInstance(mContext).isConnected("Wi-Fi名称")) {WIFIConnectionManager.getInstance(mContext).connect("Wi-Fi名称", "Wi-Fi密码");}}}
工具类 WIFIConnectionManager
public class WIFIConnectionManager {private static final String TAG = WIFIConnectionManager.class.getName();private static WIFIConnectionManager sInstance = null;private android.net.wifi.WifiManager mWifiManager;private int networkId;public WIFIConnectionManager(Context context) {mWifiManager = (android.net.wifi.WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);}public static WIFIConnectionManager getInstance(Context context) {if (sInstance == null) {synchronized (WIFIConnectionManager.class) {if (sInstance == null) {sInstance = new WIFIConnectionManager(context);}}}return sInstance;}/*** 尝试连接指定wifi** @param ssid wifi名* @param password 密码* @return 是否连接成功*/public boolean connect(@NonNull String ssid, @NonNull String password) {Log.d(TAG, "connect() called with: ssid = [" + ssid + "], password = [" + password + "]");Log.d(TAG, "connect: wifi opened = " + openWifi());boolean isConnected = isConnected(ssid);//当前已连接至指定wifiLog.d(TAG, "connect: is already connected = " + isConnected);if (isConnected) {return true;}networkId = mWifiManager.addNetwork(newWifiConfig(ssid, password, true));boolean result = mWifiManager.enableNetwork(networkId, true);Log.d(TAG, "connect: network enabled = " + result);return result;}/*** 根据wifi名与密码配置 WiFiConfiguration, 每次尝试都会先断开已有连接** @param isClient 当前设备是作为客户端,还是作为服务端, 影响SSID和PWD*/@NonNullprivate WifiConfiguration newWifiConfig(String ssid, String password, boolean isClient) {WifiConfiguration config = new WifiConfiguration();config.allowedAuthAlgorithms.clear();config.allowedGroupCiphers.clear();config.allowedKeyManagement.clear();config.allowedPairwiseCiphers.clear();config.allowedProtocols.clear();if (isClient) {//作为客户端, 连接服务端wifi热点时要加双引号config.SSID = "\"" + ssid + "\"";config.preSharedKey = "\"" + password + "\"";} else {//作为服务端, 开放wifi热点时不需要加双引号config.SSID = ssid;config.preSharedKey = password;}config.hiddenSSID = true;config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);config.status = WifiConfiguration.Status.ENABLED;return config;}/*** @return 热点是否已开启*/public boolean isWifiEnabled() {try {Method methodIsWifiApEnabled = WifiManager.class.getDeclaredMethod("isWifiApEnabled");return (boolean) methodIsWifiApEnabled.invoke(mWifiManager);} catch (Exception e) {Log.e(TAG, "isWifiEnabled: ", e);return false;}}/*** 是否已连接指定wifi*/public boolean isConnected(String ssid) {WifiInfo wifiInfo = mWifiManager.getConnectionInfo();if (wifiInfo == null) {return false;}switch (wifiInfo.getSupplicantState()) {case AUTHENTICATING:case ASSOCIATING:case ASSOCIATED:case FOUR_WAY_HANDSHAKE:case GROUP_HANDSHAKE:case COMPLETED:return wifiInfo.getSSID().replace("\"", "").equals(ssid);default:return false;}}/*** 打开WiFi* @return*/public boolean openWifi() {boolean opened = true;if (!mWifiManager.isWifiEnabled()) {opened = mWifiManager.setWifiEnabled(true);}return opened;}/*** 关闭wifi* @return*/public boolean closeWifi() {boolean closed = true;if (mWifiManager.isWifiEnabled()) {closed = mWifiManager.setWifiEnabled(false);}return closed;}/*** 断开连接* @return*/public WIFIConnectionManager disconnect() {if (networkId != 0) {mWifiManager.disableNetwork(networkId);}mWifiManager.disconnect();return this;}/*** 是否连接过指定Wifi*/@Nullablepublic WifiConfiguration everConnected(String ssid) {List<WifiConfiguration> existingConfigs = mWifiManager.getConfiguredNetworks();if (existingConfigs == null || existingConfigs.isEmpty()) {return null;}ssid = "\"" + ssid + "\"";for (WifiConfiguration existingConfig : existingConfigs) {if (existingConfig.SSID.equals(ssid)) {return existingConfig;}}return null;}/*** 获取本机的ip地址*/@Nullablepublic String getLocalIp() {return convertIp(mWifiManager.getConnectionInfo().getIpAddress());}private String convertIp(int ipAddress) {if (ipAddress == 0) return null;return ((ipAddress & 0xff) + "." + (ipAddress >> 8 & 0xff) + "."+ (ipAddress >> 16 & 0xff) + "." + (ipAddress >> 24 & 0xff));}public WifiManager getWifiManager() {return mWifiManager;}
}
WIFIAutoConnectionService
public class WIFIAutoConnectionService extends Service {public static final String SSID = "HUAWEI";public static final String PWD = "nihao321";private static final String TAG = WIFIAutoConnectionService.class.getSimpleName();private static final String KEY_SSID = "WI-FI名称";private static final String KEY_PWD = "WI-FI密码";/*** wifi名*/private String mSsid = "";/*** 密码*/private String mPwd = "";/*** 负责不断尝试连接指定wifi*/private Handler mHandler = new Handler(Looper.getMainLooper(), new Handler.Callback() {@Overridepublic boolean handleMessage(Message msg) {WIFIConnectionManager.getInstance(WIFIAutoConnectionService.this).connect(mSsid, mPwd);boolean connected = WIFIConnectionManager.getInstance(WIFIAutoConnectionService.this).isConnected(mSsid);Log.d(TAG, "handleMessage: wifi connected = " + connected);if (!connected) {Log.d(TAG, "handleMessage: re-try in 5 seconds");mHandler.sendEmptyMessageDelayed(0, 5000);//5s循环}return true;}});/*** 连接指定wifi热点, 失败后5s循环** @param context 用于启动服务的上下文* @param ssid 默认HUD-WIFI* @param pwd (WPA加密)默认12345678*/public static void start(Context context, String ssid, String pwd) {Intent starter = new Intent(context,WIFIAutoConnectionService.class);starter.putExtra(KEY_SSID, ssid).putExtra(KEY_PWD, pwd);context.startService(starter);Log.d(TAG, "start: ");}@Overridepublic void onCreate() {super.onCreate();}/*** @return always null*/@Nullable@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {mSsid = intent.getStringExtra(KEY_SSID);mPwd = intent.getStringExtra(KEY_PWD);mHandler.sendEmptyMessage(0);return START_NOT_STICKY;}@Overridepublic void onDestroy() {super.onDestroy();Log.d(TAG, "onDestroy: ");}}
这里只需要把Wi-Fi名称和密码换成自己所需要的就可以实现功能了。
相关文章:
知道Wi-Fi名称和密码之后自动连接
这里写自定义目录标题 有Wi-Fi名称和密码自动连接Wi-Fi主Activity服务类 WIFIStateReceiver工具类 WIFIConnectionManager 有Wi-Fi名称和密码自动连接Wi-Fi 主Activity public class MainActivity extends AppCompatActivity implements View.OnClickListener{private static…...
本地搭建Plex私人影音网站并结合内网穿透实现公网远程访问
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
【算法】拦截导弹(线性DP)
题目 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。 但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。 某天,雷达捕捉到敌国的导弹来袭。 由于该系…...
记 doris 加载压缩文件(lzo、snappy)pr
做了一个case,是doris支持加载lzo压缩文件。[improvement](load) Enable lzo & Remove dependency on Markus F.X.J. Oberhumers lzo library by HowardQin Pull Request #30573 apache/doris (github.com) 其实doris里已经支持了 lzo,这个case源…...
【Leetcode】2670. 找出不同元素数目差数组
文章目录 题目思路代码结果 题目 题目链接 给你一个下标从 0 开始的数组 nums ,数组长度为 n 。 nums 的 不同元素数目差 数组可以用一个长度为 n 的数组 diff 表示,其中 diff[i] 等于前缀 nums[0, …, i] 中不同元素的数目 减去 后缀 nums[i 1, …, …...
༺༽༾ཊ—Unity之-01-工厂方法模式—ཏ༿༼༻
首先创建一个项目, 在这个初始界面我们需要做一些准备工作, 建基础通用文件夹, 创建一个Plane 重置后 缩放100倍 加一个颜色, 任务:使用工厂方法模式 创建 飞船模型, 首先资源商店下载飞船模型,…...
QT仪表盘小工具
头文件: /**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE…...
【2024】大三寒假再回首:缺乏自我意识是毒药,反思和回顾是解药
2024年初,学习状态回顾 开稿时间:2024-1-23 归家百里去,飘雪送客迟。 搁笔日又久,一顾迷惘时。 我们饱含着过去的习惯,缺乏自我意识是毒药,反思和回顾是解药。 文章目录 2024年初,学习状态回顾一…...
计算机网络——网络层(3)
计算机网络——网络层(3) 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU)1 网络层——控制平面因特网中自治系统内部的路由选择总括考虑因素总结 ISP之间的路由选择:BGP考虑因素总结 SDN控制层面重要组件和功能总结 ICMP主要功能和特点…...
ROS2 学习笔记12:使用 colcon 构建软件包
ROS2 学习笔记12:使用 colcon 构建软件包 Background 背景Prerequisites 前提1 Install colcon2 Install ROS 2 Basics 基础1 Create a workspace2 Add some sources3 Source an underlay4 Build the workspace5 Run tests6 Source the environment7 Try a demo Cre…...
基于JAVA+SpringBoot+Vue的前后端分离的医院管理系统
✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 随着计算机科学的迅猛…...
npm淘宝镜像过期解决办法
npm淘宝镜像过期解决办法 因为npm 官方镜像(registry.npmjs.org)在国内访问很慢,我们基本上都会选择切换到国内的一些 npm 镜像(淘宝镜像、腾讯云镜像等)。由于淘宝原来的镜像(registry.npm.taobao.org&am…...
Arduino 官网上下载和使用开发板
在 Arduino 官网上下载和使用开发板可以按照以下步骤进行: 打开浏览器,访问 Arduino 官网(https://www.arduino.cc/)。在官网首页,可以看到各种型号的 Arduino 开发板和相关产品。根据自己的需求选 择合适的开发板型号…...
k8s学习-DaemonSet和Job
1.1DaemonSet是什么 Deployment部署的副本Pod会分布在各个Node上,每个Node都可能运行好几个副本。DaemonSet的不同之处在于:每个Node上最多只能运行⼀个副本。DaemonSet的典型应用场景有: (1)在集群的每个节点上运⾏存…...
【开源】SpringBoot框架开发海南旅游景点推荐系统
目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户端2.2 管理员端 三、系统展示四、核心代码4.1 随机景点推荐4.2 景点评价4.3 协同推荐算法4.4 网站登录4.5 查询景点美食 五、免责说明 一、摘要 1.1 项目介绍 基于VueSpringBootMySQL的海南旅游推荐系统ÿ…...
Windows10更新失败 错误 0x80070643、KB5034441的解决方法之二
Windows10更新失败 错误 0x80070643、KB5034441 在知乎Windows10更新失败 错误 0x80070643、KB5034441的原因分析和几个解决方法 - 知乎 参考文章进行操作,更详细信息自己看上面链接。 我电脑的硬盘是mbr格式,而且没有划分恢复分区。 Microsoft Windo…...
SQL中LIMIT的简单用法
在SQL的世界里,有一位神秘而强大的限制者,它就是 LIMIT。今天,我们将深入探讨这个神秘的SQL关键字,揭开它的神秘面纱,让你能够更好地使用它来操控你的数据。 背景 首先,让我们了解一下为什么我们需要 LIM…...
canvas自定义扩展方法:文字自动换行
查看专栏目录 canvas实例应用100专栏,提供canvas的基础知识,高级动画,相关应用扩展等信息。canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重…...
【2024全网最详细】Google 搜索命令终极指南
💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 你是否尝试过使用 Google 搜索作为免费的 SEO …...
R-kknn包-类别插值可视化绘制
前面的推文我们介绍了使用scikit-learn结合分类散点数据,构建机器学习分类模型并将模型结果可视化展示,具体链接如下: 机器学习和可视化还能一起这样用?Python教你全搞定。今天这篇推文,我们就使用R语言的kknn包进行类…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
