Android--ConnectivityManager使用

news2024/12/26 10:38:37

一、前言

Android10之后官方废弃了通过WifiManager连接WIFI的方式,现在要使用ConnectivityManager连接WIFI

二、连接WIFI

public class MainActivity extends AppCompatActivity {
	private static final String TAG="lkx";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		// 获取ConnectivityManager实例
		ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

		// 创建一个NetworkCallback对象,用于监听连接状态
		ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
			@Override
			public void onAvailable(Network network) {
				// 网络可用时的回调
				Log.d(TAG, "WIFI网络已连接");
			}

			@Override
			public void onLost(Network network) {
				// 网络丢失时的回调
				Log.d(TAG, "WIFI网络已断开");
			}
		};

		// 请求连接WIFI网络
		connectivityManager.requestNetwork(request, networkCallback);
	}
	// 创建一个NetworkSpecifier对象,用于指定要连接的WIFI网络
	WifiNetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
		.setSsid("Redmi K60 Pro") // 设置SSID
		.setWpa2Passphrase("11111111") // 设置密码,对于开放网络,可以省略这一步
		.build();

	// 创建一个NetworkRequest对象,用于请求连接
	NetworkRequest request = new NetworkRequest.Builder()
		.addTransportType(NetworkCapabilities.TRANSPORT_WIFI) // 指定传输类型为WIFI
		.setNetworkSpecifier(specifier) // 设置NetworkSpecifier
		.build();

}

在这里插入图片描述
连接时会有一个弹窗,点击连接会进行连接,之后会触发相应的回调
在回调内部类中还有多个回调方法,具体可以看ConnectivityManager
但是有一个问题,如果这个网络之前被连接过,在弹窗还没点确定时,这个WIFI就会连接,连接成功触发onAvailable回调,如果此时再点连接,会断开连接触发onLost,然后再重新连接

二、扫描WIFI网络

WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);

// 注册一个 BroadcastReceiver 来监听扫描结果
BroadcastReceiver wifiScanReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        boolean success = intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false);
        if (success) {
            scanSuccess();
        } else {
            // 扫描失败处理
            scanFailure();
        }
    }

    private void scanSuccess() {
        List<ScanResult> results = wifiManager.getScanResults();
        for (ScanResult result : results) {
            if (result.SSID.equals(selectAp.SSID)) {
                // 找到匹配的SSID,获取信号强度
                int signalLevel = WifiManager.calculateSignalLevel(result.level, 100);
                Log.d(TAG, "Found SSID: " + result.SSID + ", Signal Strength: " + signalLevel);
                // 根据需要处理信号强度
            }
        }
    }

    private void scanFailure() {
        // 处理扫描失败的情况,可能需要重新扫描或者显示错误信息
    }
};

// 注册 BroadcastReceiver
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
registerReceiver(wifiScanReceiver, intentFilter);

// 开始扫描
boolean success = wifiManager.startScan();
if (!success) {
    // 扫描失败处理
}

扫描WIFI网络还是使用的WifiManager ,调用startScan方法开始扫描,之后会发送一个广播,需要APK接受这个广播,之后通过wifiManager.getScanResults()来获取所有WIFI的相关信息列表,上面代码是查询指定WIFI名字的信号强度

三、资源释放

        if(isNetworkCallbackRegistered){
            connManager.unregisterNetworkCallback(networkCallback);
            isNetworkCallbackRegistered = false;
        }

在onDestroy或者不再使用WIFI时,要调用connManager.unregisterNetworkCallback(networkCallback);
这不会立即断开WIFI,相当于是把这个WIFI弄成了一个弱引用,什么时候断由系统决定

如果没有调用requestNetwork就调用unregisterNetworkCallback会抛出异常,所以最好加一个变量来判断是否需要调用unregisterNetworkCallback

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1605159.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MongoDB】数据的自动过期,TTL索引

文章目录 1. 前言2.概念与使用2.1.使用方式2.2.数组中包含日期字段2.3.设置具体的过期时间点2.4.额外的过滤条件 3.总结 1. 前言 在近期的工作中&#xff0c;使用了MongoDB来保存了一些日志数据&#xff0c;但是这些日志数据具有一定的时效性&#xff0c;也就是按照业务的需要…

K8S部署Nginx与问题

【containerd错误解决系列】failed to create shim task, OCI runtime create failed, unable to retrieve OCI... 环境 # cat /etc/redhat-release CentOS Linux release 8.0.1905 (Core) # uname -r 4.18.0-348.rt7.130.el8.x86_64 问题及现象 1、pod的状态全部都是Conta…

lua学习笔记18(面相对象之多态)

print("*****************************面相对象多态*******************************") --相同方法不同执行逻辑 object{} object.id1 function object:new()local obj{}self.__indexself setmetatable(obj,self)return obj end function object:subClass(className)…

C/C++基础----内存相关

malloc分配内存 用法 参数为要开辟内存的大小&#xff08;字节为单位&#xff09;返回值为void*,所以要强转一下语法&#xff1a;malloc()动态开辟20个字节的内存&#xff0c;代码&#xff1a;#include <iostream>using namespace std;int main() {int *a (int *) mal…

利用常量数组解码的方法

【题目描述】 把手放在键盘上时&#xff0c;稍不注意就会往右错一位。这样&#xff0c;输入Q会变成输入W&#xff0c;输入J会变成输入K等。键盘如图所示。 输入错位后敲出的几行字符串&#xff0c;输出打字员本来想打出的句子。 输入仅包含数字、空格、大写字母或标点符号&am…

笔试题4 -- 除2!(k次机会偶数除2求最小和)

除2&#xff01;(k次机会偶数除2求最小和) 文章目录 除2&#xff01;(k次机会偶数除2求最小和)读懂题目方案一&#xff08;基于multiset实现 -- 超时&#xff09;方案二&#xff08;改进算法--基于 priority_queue 实现&#xff09;总结 题目链接&#xff1a; 除2&#xff01;…

【优质书籍推荐】《Effective Java》是人工智能的基石

大家好&#xff0c;我是爱编程的喵喵。双985硕士毕业&#xff0c;现担任全栈工程师一职&#xff0c;热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…

3D可视化技术:研发基地的科技新篇章

在科技日新月异的今天&#xff0c;我们生活在一个充满无限可能性的时代。而在这个时代中&#xff0c;3D可视化技术正以其独特的魅力&#xff0c;引领着科技领域的新一轮变革。 3D可视化技术通过三维图像的方式&#xff0c;将现实世界或虚拟世界中的物体、场景等以立体、逼真的形…

FileZilla安装下载与使用

实用工具系列 - FileZilla安装下载与使用_filezilla下载-CSDN博客文章浏览阅读4.4k次&#xff0c;点赞112次&#xff0c;收藏113次。一、概述二、下载三、安装四、使用教程_filezilla下载https://blog.csdn.net/Passerby_Wang/article/details/125298958?ops_request_misc%257…

湖仓一体(Lakehouse)架构的核心组件之存储层——Lakehouse 架构(三)

文章目录 前言Lakehouse 存储关键概念行存储与列存储基于存储的查询性能优化 Lakehouse 存储组件云储存文件格式Apache ParquetApache ORCApache Avro相似点和差异点 表格格式Apache HiveIceberg特性和优点 Apache Hudi特性和优点 Delta Lake特性和优点 相似点和差异点 总结 前…

抓住2024必应Bing国内广告推广的获客流量红利期

线上广告已成为企业获取客户流量的重要手段&#xff0c;作为全球领先的搜索引擎之一&#xff0c;必应Bing在国内市场拥有庞大的用户群体&#xff0c;为企业提供了一个宝贵的广告推广平台。展望2024年&#xff0c;必应Bing国内广告推广预计将进入一个获客流量的红利期&#xff0…

C语言知识(1) static修饰详解分享

1.前言 哈喽大家好啊&#xff0c;今天来给大家分享c中static的使用&#xff0c;希望能对大家有所帮助&#xff0c;请大家多多点赞&#xff0c;收藏支持我哦~ 2.正文 在讲解static之前&#xff0c;先给大家铺垫三个概念&#xff0c;方便大家理解。 2.1三则知识铺垫 2.1.1作…

Windows突然蓝屏解决办法

Windows突然蓝屏&#xff0c;然后重复开机没有用&#xff0c;但是能进入bios系统&#xff0c;证明内存和磁盘没事&#xff0c;用大白菜制作了PE系统盘制作过程&#xff08;之前一直都是用官方镜像制作&#xff0c;但是发现用大白菜制作可以对系统之前的磁盘里面重要的信息拷贝到…

Pixverse:开启文生视频与图生视频新纪元

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

“广进计划”中的特斯拉,加码驱动Robotaxi能否迎来新未来?

近期&#xff0c;特斯拉可以说是热搜上的常驻选手。 公司先是透露将于8月8日推出自动驾驶出租车Robotaxi&#xff0c;再是宣布将开启“广进计划”&#xff0c;在全球范围内裁员10%。官方资料显示&#xff0c;截至2023年末&#xff0c;特斯拉全球拥有超14万名员工&#xff0c;此…

OpenVINO安装教程 Anaconda版

从 Conda Forge 安装 OpenVINO™ Runtime 请注意&#xff0c;Conda Forge 发行版&#xff1a; 提供 C/C 和 Python API 不支持 NPU 推理 专用于所有主要操作系统的用户&#xff1a;Windows、Linux 和 macOS &#xff08;所有 x86_64 / ARM64 架构&#xff09; 使用 Anaconda…

CSS导读 (CSS的三大特性 上)

&#xff08;大家好&#xff0c;今天我们将继续来学习CSS的相关知识&#xff0c;大家可以在评论区进行互动答疑哦~加油&#xff01;&#x1f495;&#xff09; 目录 五、CSS的三大特性 5.1 层叠性 5.2 继承性 5.2.1 行高的继承 5.3 优先级 小练习 五、CSS的三大特性 …

Windows电脑上能用的便签记事软件

上班族大多都依赖电脑进行办公&#xff0c;他们在电脑上完成各式各样的工作任务。因此&#xff0c;下载并安装高效率的软件成了提升工作效率的关键。其中&#xff0c;一款好的便签软件能够极大地帮助他们管理和跟踪任务。那么&#xff0c;有没有一款适合在电脑上使用的出色的便…

【c语言】自定义类型:结构体详解

目录 自定义类型&#xff1a;结构体 结构体类型的声明 结构体变量的创建和初始化 结构的特殊声明 结构的自引用 结构体内存对齐 对其规则 为什么存在内存对齐&#xff1f; 修改默认对⻬数 结构体传参 结构体实现位段 位段的内存分配 位段的跨平台问题 位段的应用…

github克隆报错:failed: The TLS connection was non-properly terminated.

github克隆gazebo_ros_control报错 fatal: unable to access https://github.com/ros-controls/gazebo_ros_control.git/: gnutls_handshake() failed: The TLS connection was non-properly terminated. sudo apt-get install ros-noetic-gazebo-ros-control git 克隆gazeb…