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

Android WIFI工具类 特别兼容Android12

直接上代码:

package com.realtop.commonutils.utils;import android.annotation.SuppressLint;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothManager;
import android.bluetooth.BluetoothProfile;
import android.content.Context;
import android.net.IpConfiguration;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiEnterpriseConfig;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.text.TextUtils;
import android.util.Log;import java.util.ArrayList;
import java.util.List;public class WIFIHelper {public static final String TAG = "wifi_utils";public static String getForgetName(WifiManager manager) {WifiInfo connectionInfo = manager.getConnectionInfo();String ssid = connectionInfo.getSSID().replace("\"", "");return ssid;}public static void forgetNetwork(WifiManager manager) {try {WifiInfo connectionInfo = manager.getConnectionInfo();String ssid = connectionInfo.getSSID().replace("\"", "");int networkId = connectionInfo.getNetworkId();Log.i(TAG, "forgetNetwork: enter:" + ssid + "; " + networkId);manager.forget(networkId, new WifiManager.ActionListener() {@Overridepublic void onSuccess() {Log.i(TAG, "forgetNetwork: onSuccess: is ok");manager.removeNetwork(networkId);}@Overridepublic void onFailure(int reason) {Log.i(TAG, "forgetNetwork: onFailure: reason:" + reason);manager.removeNetwork(networkId);}});ComUtils.saveString(ComConfig.WIFI_PWD_PRE + ssid, "");Log.i(TAG, "forgetNetwork: remove id:" + networkId + ";" + ssid);} catch (Exception e) {e.printStackTrace();Log.i(TAG, "forgetNetwork: error:" + e.getMessage());}}/*** 连接wifi** @param manager       WifiManager* @param configuration Wifi配置* @return 是否连接成功*/public static boolean connectWifi(WifiManager manager, WifiConfiguration configuration) {Log.i(TAG, "connectWifi: enter");manager.connect(configuration, new WifiManager.ActionListener() {@Overridepublic void onSuccess() {Log.i(TAG, "connectWifi: onSuccess: connect ok");}@Overridepublic void onFailure(int reason) {Log.i(TAG, "connectWifi: onFailure: error:" + reason);}});return true;}/*** 创建Wifi配置** @param SSID         wifi名称* @param password     wifi密码* @param hidden       网络是否隐藏(该方法与添加隐藏网络通用)* @param capabilities 网络安全协议* @return 配置好的wifi*/public static WifiConfiguration createWifiInfo(String SSID, String password, boolean hidden, String capabilities) {WifiConfiguration configuration = new WifiConfiguration();configuration.SSID = "\"" + SSID + "\"";if (hidden) {configuration.hiddenSSID = true;}Log.d("WifiManagerUtils", "createWifiInfo: " + capabilities);if (capabilities.contains("SAE") && Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {setWPA3(configuration, password);} else if (capabilities.contains("WPA-PSK") || capabilities.contains("WPA2-PSK")) {setWPA(configuration, password);} else if (capabilities.contains("WEP")) {setWEP(configuration, password);} else {setESS(configuration);}return configuration;}@SuppressLint("NewApi")public static WifiConfiguration createWifiConfiguration(String SSID, String password, boolean hidden, String capabilities) {WifiConfiguration config = new WifiConfiguration();config.SSID = "\"" + SSID + "\"";config.hiddenSSID = hidden;config.shared = false;Log.d("WifiManagerUtils", "createWifiInfo: " + capabilities);// 分别适配安全类型if (capabilities.contains("SAE")) {config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_SAE);if (!TextUtils.isEmpty(password)) {config.preSharedKey = '"' + password + '"';}Log.i(TAG, "createWifiConfiguration: sae");} else if (capabilities.contains("WPA-PSK") || capabilities.contains("WPA2-PSK")) {config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_PSK);if (!TextUtils.isEmpty(password)) {if (password.matches("[0-9A-Fa-f]{64}")) {config.preSharedKey = password;} else {config.preSharedKey = '"' + password + '"';}}Log.i(TAG, "createWifiConfiguration: psk");} else if (capabilities.contains("WEP")) {config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_WEP);if (!TextUtils.isEmpty(password)) {int length = password.length();// WEP-40, WEP-104, and 256-bit WEP (WEP-232?)if ((length == 10 || length == 26 || length == 58)&& password.matches("[0-9A-Fa-f]*")) {config.wepKeys[0] = password;} else {config.wepKeys[0] = '"' + password + '"';}}Log.i(TAG, "createWifiConfiguration: wep");} else if (capabilities.contains("OWE")) {config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_OWE);Log.i(TAG, "createWifiConfiguration: owe");} else if (capabilities.contains("EAP")) {setEAP(config, password);Log.i(TAG, "createWifiConfiguration: eap");} else {// 无密码config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_OPEN);config.shared = true;Log.i(TAG, "createWifiConfiguration: open");}final IpConfiguration ipConfig = new IpConfiguration();ipConfig.setIpAssignment(IpConfiguration.IpAssignment.UNASSIGNED);ipConfig.setProxySettings(IpConfiguration.ProxySettings.UNASSIGNED);ipConfig.setStaticIpConfiguration(null);ipConfig.setHttpProxy(null);config.setIpConfiguration(ipConfig);return config;}private static void setEAP(WifiConfiguration wifiConfig, String password) {// 设置身份验证类型为 EAPwifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);// 设置 EAP 方法(这是具体的 EAP 身份验证类型)wifiConfig.enterpriseConfig.setEapMethod(-1);// 设置身份验证用户名和密码wifiConfig.enterpriseConfig.setIdentity("");wifiConfig.enterpriseConfig.setPassword(password);}/*** 设置wpa3协议** @param configuration 配置* @param password      密码*/public static void setWPA3(WifiConfiguration configuration, String password) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.SAE);}configuration.preSharedKey = "\"" + password + "\"";}/*** WPA协议** @param configuration 配置* @param password      密码*/public static void setWPA(WifiConfiguration configuration, String password) {configuration.preSharedKey = "\"" + password + "\"";//公认的IEEE 802.11验证算法。configuration.allowedAuthAlgorithms.clear();configuration.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);//公认的的公共组密码。configuration.allowedGroupCiphers.clear();configuration.allowedGroupCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);//公认的密钥管理方案。configuration.allowedKeyManagement.clear();configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);//密码为WPA。configuration.allowedPairwiseCiphers.clear();configuration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);configuration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);//公认的安全协议。configuration.allowedProtocols.clear();configuration.allowedProtocols.set(WifiConfiguration.Protocol.RSN);}/*** WEP协议** @param configuration 配置* @param password      密码*/public static void setWEP(WifiConfiguration configuration, String password) {configuration.wepKeys[0] = "\"" + password + "\"";configuration.wepTxKeyIndex = 0;configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);}/*** 无密码** @param configuration 配置*/public static void setESS(WifiConfiguration configuration) {configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);}public static List<BluetoothDevice> getBlueConnectDevices() {BluetoothManager bluetoothManager = (BluetoothManager) EventBusHelper.getContext().getSystemService(Context.BLUETOOTH_SERVICE);@SuppressLint("MissingPermission")List<BluetoothDevice> connectedDevices = bluetoothManager.getConnectedDevices(BluetoothProfile.GATT);if (connectedDevices != null) {return connectedDevices;} else {return new ArrayList<>();}}
}

相关文章:

Android WIFI工具类 特别兼容Android12

直接上代码&#xff1a; package com.realtop.commonutils.utils;import android.annotation.SuppressLint; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothManager; import android.bluetooth.BluetoothProfile; import android.content.Con…...

【Android Framework系列】第14章 Fragment核心原理(AndroidX版本)

1 简介 Fragment是一个历史悠久的组件&#xff0c;从API 11引入至今&#xff0c;已经成为Android开发中最常用的组件之一。 Fragment表示应用界面中可重复使用的一部分。Fragment定义和管理自己的布局&#xff0c;具有自己的生命周期&#xff0c;并且可以处理自己的输入事件。…...

Python 网页爬虫原理及代理 IP 使用

目录 前言 一、Python 网页爬虫原理 二、Python 网页爬虫案例 步骤1&#xff1a;分析网页 步骤2&#xff1a;提取数据 步骤3&#xff1a;存储数据 三、使用代理 IP 四、总结 前言 随着互联网的发展&#xff0c;网络上的信息量变得越来越庞大。对于数据分析人员和研究人…...

失效的访问控制及漏洞复现

失效的访问控制(越权) 1. 失效的访问控制(越权) 1.1 OWASP TOP10 1.1.1 A5:2017-Broken Access Control 未对通过身份验证的用户实施恰当的访问控制。攻击者可以利用这些缺陷访问未经授权的功能或数据&#xff0c;例如&#xff1a;访问其他用户的帐户、查看敏感文件、修改其…...

MLOps:掌握机器学习部署:Docker、Kubernetes、Helm 现代 Web 框架

介绍&#xff1a; 在机器学习的动态世界中&#xff0c;从开发模型到将其投入生产的过程通常被认为是复杂且多方面的。 然而&#xff0c;随着 Docker、Kubernetes 等工具以及 FastAPI、Streamlit 和 Gradio 等用户友好的 Web 框架的出现&#xff0c;这一过程变得比以往更加简化…...

Python标识符命名规范

简单地理解&#xff0c;标识符就是一个名字&#xff0c;就好像我们每个人都有属于自己的名字&#xff0c;它的主要作用就是作为变量、函数、类、模块以及其他对象的名称。 Python 中标识符的命名不是随意的&#xff0c;而是要遵守一定的命令规则&#xff0c;比如说&#xff1a;…...

对 fastq 和 bam 进行 downsample

对 fastq 和 bam 进行 downsample 一、Fastq1、seqtk二、Bam1、samtools2、Picard DownsampleSam3、比较 并行采样模板 一、Fastq 1、seqtk Seqtk 是一种快速轻量级的工具&#xff0c;用于处理 FASTA 或 FASTQ 格式的序列。 它可以无缝解析 FASTA 和 FASTQ 文件&#xff0c;这…...

网络爬虫:如何有效的检测分布式爬虫

分布式爬虫是一种高效的爬虫方式&#xff0c;它可以将爬虫任务分配给多个节点同时执行&#xff0c;从而加快爬虫的速度。然而&#xff0c;分布式爬虫也容易被目标网站识别为恶意行为&#xff0c;从而导致IP被封禁。那么&#xff0c;如何有效地检测分布式爬虫呢&#xff1f;本文…...

elementUI可拖拉宽度抽屉

1&#xff0c;需求&#xff1a; 在elementUI的抽屉基础上&#xff0c;添加可拖动侧边栏宽度的功能&#xff0c;实现效果如下&#xff1a; 2&#xff0c;在原组件上添加自定义命令 <el-drawer v-drawerDrag"left" :visible.sync"drawerVisible" direc…...

OpenPCDet系列 | 8.4 nuScenes数据集数据调用和数据分析

文章目录 1. 对数据集遍历1.1 统计mini版本的nuScenes各模态数据和关键帧的数量1.2 单独遍历lidar模态数据1.3 遍历scene统计数据1.4 遍历sample统计数据1.5 遍历sample_data统计数据1.6 数据集的底层结构2. 对数据集可视化2.1 render_sample和render_sample_data2.2 nusc.rend…...

WeiTitlePopupWindow

目录 1 WeiTitlePopupWindow 1.1 // 设置可点击 1.2 // 设置弹窗外可点击 1.3 // 设置弹窗宽度和高度 1.4 // 设置弹窗布局界面 WeiTitlePopupWindow // 设置可点击setTouchable(true);...

qemu/kvm学习笔记

qemu/kvm架构 cpu虚拟化的示例 Reference: kvmtest.c [LWN.net] 主要步骤&#xff1a; QEMU通过/dev/kvm设备文件发起KVM_CREATE_VM ioctl&#xff0c;请求KVM创建一个虚拟机。KVM创建虚拟机相应的结构体&#xff0c;并为QEMU返回一个虚拟机文件描述符QEMU通过虚拟机文件描述…...

android 车载widget小部件部分详细源码实战开发-千里马车载车机framework开发实战课程

官网参考链接&#xff1a;https://developer.android.google.cn/develop/ui/views/appwidgets/overview 1、什么是小部件 App widgets are miniature application views that can be embedded in other applications (such as the home screen) and receive periodic updates…...

如何使用CSS画一个三角形

原理&#xff1a;其实就是规定元素的四个边框颜色及边框宽度&#xff0c;将元素宽高设置为0。如果要哪个方向的三角形&#xff0c;将对应其他三个方向的边框宽和颜色设置为0和透明transparent即可 1.元素设置边框&#xff0c;宽高&#xff0c;背景色 <style>.border {w…...

第15章_锁: (表级锁、页级锁、行锁、悲观锁、乐观锁、全局锁、死锁)

3.2 从数据操作的粒度划分&#xff1a;表级锁、页级锁、行锁 为了提高数据库并发度&#xff0c;每次锁定的数据范围越小越好&#xff0c;理论上每次只锁定当前操作的数据的方案会得到最大的并发度&#xff0c;但管理锁是很耗资源&#xff08;涉及获取、检查、释放锁等动作)。因…...

python音频转文字调用baidu

python音频转文字调用的是百度智能云的接口&#xff0c;因业务需求会涉及比较多数字&#xff0c;所以这里做了数字的处理&#xff0c;可根据自己的需求修改。 from flask import Flask, request, jsonify import requestsfrom flask_limiter import Limiterapp Flask(__name_…...

靶场溯源第二题

关卡描述&#xff1a;1. 网站后台登陆地址是多少&#xff1f;&#xff08;相对路径&#xff09; 首先这种确定的网站访问的都是http或者https协议&#xff0c;搜索http看看。关于http的就这两个信息&#xff0c;然后172.16.60.199出现最多&#xff0c;先过滤这个ip看看 这个很…...

mysql 的增删改查以及模糊查询、字符集语句的使用

一、mysql启动与登陆(windows下的mysql操作) 1.启动mysql服务 net start mysql81 2.登陆mysql mysql -uroot -p 3.查看所有数据库 show databases; 二、模糊查询&#xff08;like&#xff09; 1. _代表查询单个 2.%代表查询多个 3.查找所有含有schema的数据库&#xff1b;…...

Python Django框架中文教程:学习简单、灵活、高效的Web应用程序框架

概述: Python Django是一种流行的Web应用程序框架&#xff0c;被广泛应用于开发高效、可扩展的网站和Web应用程序。Django以其简单、灵活和高效而受到开发者们的青睐。它提供了强大的工具和功能&#xff0c;使开发过程更加容易和高效。 Django的主要目标是帮助开发者快速构建…...

Docker认识即安装

Docker及相关概念 Docker和虚拟机方式的区别&#xff1a;虚拟机技术是虚拟出一套硬件后&#xff0c;在其上运行一个完整的操作系统&#xff0c;在该系统上在运行所需应用进程&#xff1b;而容器内的应用进程是直接运行于宿主的内核&#xff0c;容器内没有自己的内核&#xff0…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目&#xff0c;该项目是一个 Spring AI 快速入门的样例工程项目&#xff0c;旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计&#xff0c;每个模块都专注于特定的功能领域&#xff0c;便于学习和…...

提升移动端网页调试效率:WebDebugX 与常见工具组合实践

在日常移动端开发中&#xff0c;网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时&#xff0c;开发者迫切需要一套高效、可靠且跨平台的调试方案。过去&#xff0c;我们或多或少使用过 Chrome DevTools、Remote Debug…...