Android 12(API 31)下Xamarin Forms获取SSID返回<unknown ssid>问题
Android 12(API 31)下Xamarin.Forms获取WiFi SSID的解决方案
一、补全必要权限
Android 12起,获取WiFi SSID除了定位权限外,必须添加ACCESS_WIFI_STATE权限,这是你之前遗漏的核心配置。修改AndroidManifest.xml,补充以下权限声明:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
注:ACCESS_WIFI_STATE属于正常权限,无需动态申请,仅需在清单中声明即可。
二、修正代码实现
方案1:继续使用WifiManager(虽已弃用但仍兼容Android 12)
先确保已获取ACCESS_FINE_LOCATION权限,再执行SSID获取逻辑:
public string GetWifiDetails() { // 检查定位权限是否已授予 if (ContextCompat.CheckSelfPermission(Application.Context, Manifest.Permission.AccessFineLocation) != Permission.Granted) { // 此处可触发动态权限申请流程,或返回空值提示用户 return string.Empty; } var wifiManager = (WifiManager)Application.Context.GetSystemService(Context.WifiService); var wifiInfo = wifiManager.ConnectionInfo; // Android返回的SSID默认带双引号,需去除 return wifiInfo.SSID?.Replace("\"", "") ?? "<unknown ssid>"; }
方案2:使用官方推荐的ConnectivityManager(适配API 31+)
该方案更符合Android 12及以上的API规范,需增加网络类型判断避免空值:
public string GetWifiDetails() { if (ContextCompat.CheckSelfPermission(Application.Context, Manifest.Permission.AccessFineLocation) != Permission.Granted) { return string.Empty; } ConnectivityManager cm = (ConnectivityManager)Application.Context.GetSystemService(Context.ConnectivityService); Network activeNetwork = cm.ActiveNetwork; if (activeNetwork == null) return "<unknown ssid>"; NetworkCapabilities capabilities = cm.GetNetworkCapabilities(activeNetwork); // 确认当前网络为WiFi类型 if (capabilities == null || !capabilities.HasTransport(TransportType.Wifi)) return "<unknown ssid>"; WifiInfo wifiInfo = capabilities.TransportInfo as WifiInfo; return wifiInfo?.SSID?.Replace("\"", "") ?? "<unknown ssid>"; }
三、核心注意点
- 必须确保用户授予前台定位权限(即“仅在使用应用时允许”),后台定位权限无法获取WiFi SSID。
- 使用
ConnectivityManager时,务必先判断当前活跃网络是否为WiFi,否则TransportInfo会返回空值。 - Android系统返回的SSID默认包含双引号,需通过字符串替换去除。
内容的提问来源于stack exchange,提问作者BSB
相关产品推荐
相关产品推荐

