获取Android热点SSID时触发java.lang.SecurityException权限异常
解决获取WiFi热点SSID时的SecurityException问题
异常原因
你遇到的异常:
java.lang.SecurityException: App not allowed to read or update stored WiFi Ap config (uid = 11529)
本质是普通第三方应用没有权限访问系统的WiFi热点配置。getWifiApConfiguration属于系统隐藏API,仅允许系统应用或拥有系统签名的应用调用,普通应用即使通过反射调用也会被系统权限拦截。
可行解决方案
1. 基础权限申请(仅低版本有效)
在AndroidManifest.xml中添加必要权限:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
注意:该方案仅在Android 7.1及以下版本可能生效,Android 8.0+对热点配置的访问做了严格限制,普通应用无法绕过。
2. Android 10+ 替代方案
如果应用目标版本是API 29及以上,可以尝试通过ConnectivityManager获取当前活跃的WiFi网络信息(仅能获取当前运行的热点SSID,且前提是热点处于开启状态):
ConnectivityManager connManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); Network activeNetwork = connManager.getActiveNetwork(); if (activeNetwork != null) { NetworkCapabilities capabilities = connManager.getNetworkCapabilities(activeNetwork); if (capabilities != null && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) { WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); WifiInfo wifiInfo = wifiManager.getConnectionInfo(); String ssid = wifiInfo.getSSID().replace("\"", ""); // 去除SSID自带的引号 } }
注意:该方法仅能获取设备当前连接的WiFi热点,若要获取自身开启的热点SSID,普通应用依然无法实现。
3. 系统应用/系统签名方式
如果你的应用是系统级应用(比如定制ROM内置应用),可以通过以下步骤解决:
- 在
AndroidManifest.xml中添加系统权限:<uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> - 使用系统签名对应用进行签名,此时反射调用
getWifiApConfiguration即可正常获取热点SSID。
内容的提问来源于stack exchange,提问作者Nidhi Upadhyay
相关产品推荐
相关产品推荐

