当前位置: 首页 > news >正文

知道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私人影音网站并结合内网穿透实现公网远程访问

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

【算法】拦截导弹(线性DP)

题目 某国为了防御敌国的导弹袭击&#xff0c;发展出一种导弹拦截系统。 但是这种导弹拦截系统有一个缺陷&#xff1a;虽然它的第一发炮弹能够到达任意的高度&#xff0c;但是以后每一发炮弹都不能高于前一发的高度。 某天&#xff0c;雷达捕捉到敌国的导弹来袭。 由于该系…...

记 doris 加载压缩文件(lzo、snappy)pr

做了一个case&#xff0c;是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&#xff0c;这个case源…...

【Leetcode】2670. 找出不同元素数目差数组

文章目录 题目思路代码结果 题目 题目链接 给你一个下标从 0 开始的数组 nums &#xff0c;数组长度为 n 。 nums 的 不同元素数目差 数组可以用一个长度为 n 的数组 diff 表示&#xff0c;其中 diff[i] 等于前缀 nums[0, …, i] 中不同元素的数目 减去 后缀 nums[i 1, …, …...

༺༽༾ཊ—Unity之-01-工厂方法模式—ཏ༿༼༻

首先创建一个项目&#xff0c; 在这个初始界面我们需要做一些准备工作&#xff0c; 建基础通用文件夹&#xff0c; 创建一个Plane 重置后 缩放100倍 加一个颜色&#xff0c; 任务&#xff1a;使用工厂方法模式 创建 飞船模型&#xff0c; 首先资源商店下载飞船模型&#xff0c…...

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年初&#xff0c;学习状态回顾 开稿时间&#xff1a;2024-1-23 归家百里去&#xff0c;飘雪送客迟。 搁笔日又久&#xff0c;一顾迷惘时。 我们饱含着过去的习惯&#xff0c;缺乏自我意识是毒药&#xff0c;反思和回顾是解药。 文章目录 2024年初&#xff0c;学习状态回顾一…...

计算机网络——网络层(3)

计算机网络——网络层&#xff08;3&#xff09; 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU)1 网络层——控制平面因特网中自治系统内部的路由选择总括考虑因素总结 ISP之间的路由选择&#xff1a;BGP考虑因素总结 SDN控制层面重要组件和功能总结 ICMP主要功能和特点…...

ROS2 学习笔记12:使用 colcon 构建软件包

ROS2 学习笔记12&#xff1a;使用 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技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着计算机科学的迅猛…...

npm淘宝镜像过期解决办法

npm淘宝镜像过期解决办法 因为npm 官方镜像&#xff08;registry.npmjs.org&#xff09;在国内访问很慢&#xff0c;我们基本上都会选择切换到国内的一些 npm 镜像&#xff08;淘宝镜像、腾讯云镜像等&#xff09;。由于淘宝原来的镜像&#xff08;registry.npm.taobao.org&am…...

Arduino 官网上下载和使用开发板

在 Arduino 官网上下载和使用开发板可以按照以下步骤进行&#xff1a; 打开浏览器&#xff0c;访问 Arduino 官网&#xff08;https://www.arduino.cc/&#xff09;。在官网首页&#xff0c;可以看到各种型号的 Arduino 开发板和相关产品。根据自己的需求选 择合适的开发板型号…...

k8s学习-DaemonSet和Job

1.1DaemonSet是什么 Deployment部署的副本Pod会分布在各个Node上&#xff0c;每个Node都可能运行好几个副本。DaemonSet的不同之处在于&#xff1a;每个Node上最多只能运行⼀个副本。DaemonSet的典型应用场景有&#xff1a; &#xff08;1&#xff09;在集群的每个节点上运⾏存…...

【开源】SpringBoot框架开发海南旅游景点推荐系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户端2.2 管理员端 三、系统展示四、核心代码4.1 随机景点推荐4.2 景点评价4.3 协同推荐算法4.4 网站登录4.5 查询景点美食 五、免责说明 一、摘要 1.1 项目介绍 基于VueSpringBootMySQL的海南旅游推荐系统&#xff…...

Windows10更新失败 错误 0x80070643、KB5034441的解决方法之二

Windows10更新失败 错误 0x80070643、KB5034441 在知乎Windows10更新失败 错误 0x80070643、KB5034441的原因分析和几个解决方法 - 知乎 参考文章进行操作&#xff0c;更详细信息自己看上面链接。 我电脑的硬盘是mbr格式&#xff0c;而且没有划分恢复分区。 Microsoft Windo…...

SQL中LIMIT的简单用法

在SQL的世界里&#xff0c;有一位神秘而强大的限制者&#xff0c;它就是 LIMIT。今天&#xff0c;我们将深入探讨这个神秘的SQL关键字&#xff0c;揭开它的神秘面纱&#xff0c;让你能够更好地使用它来操控你的数据。 背景 首先&#xff0c;让我们了解一下为什么我们需要 LIM…...

canvas自定义扩展方法:文字自动换行

查看专栏目录 canvas实例应用100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…...

【2024全网最详细】Google 搜索命令终极指南

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 你是否尝试过使用 Google 搜索作为免费的 SEO …...

R-kknn包-类别插值可视化绘制

前面的推文我们介绍了使用scikit-learn结合分类散点数据&#xff0c;构建机器学习分类模型并将模型结果可视化展示&#xff0c;具体链接如下&#xff1a; 机器学习和可视化还能一起这样用&#xff1f;Python教你全搞定。今天这篇推文&#xff0c;我们就使用R语言的kknn包进行类…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)

题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...

rknn toolkit2搭建和推理

安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 &#xff0c;不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源&#xff08;最常用&#xff09; conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...