You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 12:02:17