Android Q 应用切换WiFi开关的限制

Android Q 不允许应用程序开/关WIFI


当前文章首次编辑于Android Q Beta 1 版本,可能部分内容会在后期版本上发生变化,仅供参考

目的

Android Q 将切断应用对Wi-Fi设置的访问权限,防止恶意软件滥用系统功能的访问权限。

变化

运行在Q上的应用程序将无法启用/禁用WIFI, WifiManager.setWifiEnabled()方法始将终返回false,该方法不被允许

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package com.xw.androidqtest

import android.content.Context
import android.net.wifi.WifiManager
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log

class WifiActivity : AppCompatActivity() {

private val tag: String = WifiActivity::class.java.simpleName
private var wifiManager: WifiManager? = null

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_wifi)
wifiManager = this.getSystemService(Context.WIFI_SERVICE) as WifiManager?

val isWifiEnabled = wifiManager!!.isWifiEnabled
Log.d(tag, "[默认状态]是否开启 :$isWifiEnabled")
when (isWifiEnabled) {
true -> {
Log.d(tag, "[关闭]WiFi,设置WiFi状态为: false")
wifiManager!!.isWifiEnabled = false
val result = wifiManager!!.isWifiEnabled
Log.d(tag, "当前状态:$result")
if (result) {
Log.d(tag, "检查到当前是true[开启状态], 关闭WiFi: [失败]")
} else {
Log.d(tag, "检查到当前是false[关闭状态], 关闭WiFi: [成功]")
}
}
else -> {
Log.d(tag, "[开启]WiFi,设置WiFi状态为: true")
wifiManager!!.isWifiEnabled = true
val result = wifiManager!!.isWifiEnabled
Log.d(tag, "当前状态:$result")
if (result) {
Log.d(tag, "检查当前是true[开启状态], 开启WiFi: [成功]")
} else {
Log.d(tag, "检查当前是false[关闭状态], 开启WiFi: [失败]")
}
}
}
}
}
  • 当WiFi默认是开启的情况下,需要代码关闭WiFi,输出日志:
1
2
3
4
5
6
2019-03-20 08:24:51.741 1213-1650/? I/ActivityTaskManager: START u0 {cmp=com.xw.androidqtest/.WifiActivity} from uid 10505
2019-03-20 08:24:51.779 11562-11562/? D/WifiActivity: [默认状态]是否开启 :true
2019-03-20 08:24:51.779 11562-11562/? D/WifiActivity: [关闭]WiFi,设置WiFi状态为: false
2019-03-20 08:24:51.781 1213-1650/? I/WifiService: setWifiEnabled not allowed for uid=10505
2019-03-20 08:24:51.781 11562-11562/? D/WifiActivity: 当前状态:true
2019-03-20 08:24:51.781 11562-11562/? D/WifiActivity: 检查到当前是true[开启状态], 关闭WiFi: [失败]
  • 当WiFi默认是关闭的情况下,需要代码开启WiFi,输出日志:
1
2
3
4
5
6
2019-03-20 08:27:00.212 1213-3863/? I/ActivityTaskManager: START u0 {cmp=com.xw.androidqtest/.WifiActivity} from uid 10505
2019-03-20 08:27:00.245 11562-11562/? D/WifiActivity: [默认状态]是否开启 :false
2019-03-20 08:27:00.245 11562-11562/? D/WifiActivity: [开启]WiFi,设置WiFi状态为: true
2019-03-20 08:27:00.245 1213-5152/? I/WifiService: setWifiEnabled not allowed for uid=10505
2019-03-20 08:27:00.245 11562-11562/? D/WifiActivity: 当前状态:false
2019-03-20 08:27:00.245 11562-11562/? D/WifiActivity: 检查当前是false[关闭状态], 开启WiFi: [失败]

通过以上的示例可以看到,不论是开启还是关闭WiFi都没有效果,系统都将返回false,并输出setWifiEnabled不被允许的日志信息:

1
setWifiEnabled not allowed for uid= xxxx

解决方法

使用设置面板提示用户启用和禁用Wi-Fi,
调用Settings.Panel.ACTION_INTERNET_CONNECTIVITY

1
startActivity(Intent(Settings.Panel.ACTION_INTERNET_CONNECTIVITY))

本文参考官方文档简单总结,感谢您的阅读。如有不足,欢迎指正

0%