知道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包进行类…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
