Android--ConnectivityManager使用

news/2024/9/23 6:29:59/

一、前言

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

二、连接WIFI

public class MainActivity extends AppCompatActivity {private static final String TAG="lkx";@Overrideprotected 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() {@Overridepublic void onAvailable(Network network) {// 网络可用时的回调Log.d(TAG, "WIFI网络已连接");}@Overridepublic 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() {@Overridepublic 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.ppmy.cn/news/1428137.html

相关文章

uniapp uni.navigateBack 连带返回问题记录

uniapp uni.navigateBack 连带返回问题记录 问题描述 去除原生导航栏&#xff0c;使用自定义导航&#xff0c;并使用自定义返回按钮&#xff0c;通过方法handleBack.navigateBack()返回到上一页。 共有3层页面&#xff0c;A -> B -> C。都是自定义导航栏。均使用navig…

APP开发_ js 控制手机横屏或竖屏

1 Android 控制手机横屏或者竖屏的方法 1.1 配置 AndroidManifest.xml 以横屏模式为例&#xff1a; 在 Android 开发中&#xff0c;如果想让应用或某个特定的 Activity 在运行时以横屏模式显示&#xff0c;可以通过修改 Activity 的 AndroidManifest.xml 文件中的配置来实现…

pandas 中的 tolist() 和 to_list()

在使用pandas的时候&#xff0c;有时候会需要将pandas中的数据类型转换为python中的list&#xff0c;而pandas也提供了tolist()和to_list()这两个方法来实现这一需求 几乎可以认为pandas中的tolist()和to_list()用法没有差别 还顺便介绍了numpy中的tolist()方法&#xff0c;其…

OpenHarmony安全控件类型的UI控件(仅对系统应用开放)

介绍 本示例提供了安全控件类型的UI控件&#xff0c;支撑应用开发者集成安全控件做临时授权场景&#xff0c;当用户实际点击了某种类型的安全控件时&#xff0c;会对应用进行相应的临时授权&#xff0c;减少权限弹窗对用户的干扰&#xff0c;同时提供更小的授权范围。 效果预…

解读我国最新网络安全运维与数据处理安全规范:强化数字化时代安全基石

近日&#xff0c;全国网络安全标准化技术委员会秘书处公布了一系列重要的网络安全与数据安全相关技术规范草案&#xff0c;包括《网络安全技术 网络安全运维实施指南》、《网络安全技术 信息系统灾难恢复规范》以及《数据安全技术 政务数据处理安全要求》。这些规范旨在应对当前…

简介:Asp.Net Core进阶高级编程教程

课程简介目录 &#x1f680;前言一、课程背景二、课程目的三、课程特点四、课程适合人员六、最后 &#x1f680;前言 本文是《.Net Core进阶编程课程》教程专栏的导航站&#xff08;点击链接&#xff0c;跳转到专栏主页&#xff0c;欢迎订阅&#xff0c;持续更新…&#xff09…

数据仓库—维度建模—维度表设计

维度表 维度表(Dimension Table)是数据仓库中描述业务过程中各种维度信息的表,用于提供上下文和描述性信息,以丰富事实数据的分析 维度表是维度建模的灵魂所在,在维度表设计中碰到的问题(比如维度变化、维度层次、维度一致性、维度整合和拆分等)都会直接关系到维度建模…

P1278 单词游戏 简单搜索+玄学优化

单词游戏 传送门 题目描述 Io 和 Ao 在玩一个单词游戏。 他们轮流说出一个仅包含元音字母的单词&#xff0c;并且后一个单词的第一个字母必须与前一个单词的最后一个字母一致。 游戏可以从任何一个单词开始。 任何单词禁止说两遍&#xff0c;游戏中只能使用给定词典中含有…