欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

在安卓 10.0 及以上版本中,与调用 WiFi 相关的 api 操作无效,如何解决?

最编程 2024-04-22 20:49:35
...

项目功能:

android 11 的板子(硬件跟驱动都是公司的)上开发一款app,该app有WIFI相关的操作开发(实现WIFI扫描列出WiFi列表、点击保存过的WiFi进行连接、输入密码连接新WiFI、删除已连接的WiFi)。

实际开发中遇到问题的(android系统11、targetSdkVersion =30):

1)调用WiFi相关的网络操作方法removeNetwork()、reassociate()、enableNetwork()、disableNetwork()、reconnect() 和 disconnect(),这些方法无效。

2)使用WifiNetworkSuggestion时,即使平台接受你的建议(方法返回WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS),也不会进行切换或者连接新的WiFi,

即无法实现项目对网络切换、连接等操作的需求。

下面是在项目中可以实现的解决方案:

第一种:将你的App升级为系统APP。原理:APP权限升级,此时WiFi相关的api调用是可以的,但这种方式实现相对比较复杂,设备需要权限,如果你是自己的板子可以这样操作,若果不是,此方法可能行不通。

第二种:将你的targetSdkVersion设置为28,即targetSdkVersion=28即可。原理:高版本会适配低版本,这个时候即使你的app运行在10、11、12、13系统上,WiFi相关的api调用仍然跟之前的版本(10.0以下的版本)相同,

但此时一些运行时权限可能要进行更改,这个权限要视实际项目开发来看。

上述两种方式我都在项目中测试过,可以实现android 11 的板子上进行WIFI操作开发(实现WIFI扫描列出WiFi列表、点击保存过的WiFi进行连接、输入密码连接新WiFI、删除已连接的WiFi)需求。

下面是官方文档上的对WiFi相关操作的描述,可以增加你对这些问题的理解

1)对启用和停用 WLAN 实施了限制

以 Android 10 或更高版本为目标平台的应用无法启用或停用 WLAN。WifiManager.setWifiEnabled() 方法始终返回 false。

如果您需要提示用户启用或停用 WLAN,请使用设置面板。

对直接访问已配置的 WLAN 网络实施了限制

为了保护用户隐私,只有系统应用和设备政策控制器 (DPC) 支持手动配置 WLAN 网络列表。给定 DPC 可以是设备所有者,也可以是资料所有者。

如果应用以 Android 10 或更高版本为目标平台,并且应用不是系统应用或 DPC,则下列方法不会返回有用数据:

getConfiguredNetworks() 方法始终返回空列表。

注意:如果运营商应用调用 getConfiguredNetworks(),则系统返回的列表仅包含运营商配置的网络。

每个返回整数值的网络操作方法(addNetwork() 和 updateNetwork())始终返回 -1。

每个返回布尔值的网络操作(removeNetwork()、reassociate()、enableNetwork()、disableNetwork()、reconnect() 和 disconnect())始终返回 false。

2)运行 Android 10 (API 级别 29) 或更高版本 的设备允许您的应用添加设备的网络凭据,以自动连接到 WLAN 接入点。

您可以使用 WifiNetworkSuggestion 就连接到哪个网络提供建议。平台最终会根据您的应用和其他应用的建议,选择要接受的接入点。

但实际中如果用WifiNetworkSuggestion ,即使平台接受你的建议,也不会进行切换或者连接新的WiFi。平台只是接受你的应用建议,

但并不一定会使用,所以这个不符合需求开发。如果用老的api,每个返回布尔值的网络操作(removeNetwork()、reassociate()、enableNetwork()、disableNetwork()、reconnect() 和 disconnect())始终返回 false。

也不符合需求开发。