You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Android 9中使用Xamarin Forms获取活跃WiFi运营商名称并解决代码空值问题

Android 9.0+ 下Xamarin Forms获取活跃WiFi网络名称的解决方案

我懂你碰到的这个问题——之前在Android 8.0上能正常拿到WiFi名称的代码,到了Android 9.0就返回null了。这其实是Google从Android 9(API 28)开始调整了权限规则,而且原来依赖的ActiveNetworkInfo.ExtraInfo字段也逐渐被弃用了。下面给你一步步讲怎么在Xamarin Forms里搞定这个需求:

一、先搞定权限配置

Android 9.0及以上版本,获取WiFi名称需要额外的位置权限(Google隐私政策要求),加上原本就需要的WiFi状态权限,你得在Android项目的AndroidManifest.xml里添加这些声明:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

注意:位置权限需要用户手动授权,不能仅靠清单声明,所以调用获取方法前一定要先申请权限。

二、用DependencyService实现跨平台调用

因为Xamarin Forms是跨平台框架,我们需要通过依赖服务调用Android原生代码来获取WiFi信息:

1. 在共享项目定义接口

先写一个统一的接口,方便Forms层调用:

public interface IWifiInfoService
{
    string GetActiveWifiName();
}

2. 在Android项目实现接口

在你的Android项目里写这个接口的具体实现,记得加上Dependency标记让Forms能找到它:

[assembly: Dependency(typeof(WifiInfoService))]
namespace YourAppNamespace.Droid
{
    public class WifiInfoService : IWifiInfoService
    {
        public string GetActiveWifiName()
        {
            // 先检查位置权限是否已授予
            if (ContextCompat.CheckSelfPermission(Android.App.Application.Context, 
                Manifest.Permission.AccessFineLocation) != Permission.Granted)
            {
                // 权限没给的话返回null,建议在调用前先完成权限申请
                return null;
            }

            // 获取WifiManager实例
            WifiManager wifiManager = (WifiManager)Android.App.Application.Context
                .GetSystemService(Context.WifiService);
            
            if (wifiManager == null) return null;

            // 获取当前连接的WiFi信息
            WifiInfo wifiInfo = wifiManager.ConnectionInfo;
            if (wifiInfo == null || string.IsNullOrEmpty(wifiInfo.Ssid)) return null;

            // SSID会被双引号包裹,这里去掉多余的引号
            return wifiInfo.Ssid.Replace("\"", "");
        }
    }
}

3. 在Forms项目中调用服务

最后在Forms的业务代码里,通过DependencyService获取实例并调用方法:

// 先申请权限(建议用Xamarin.Essentials来处理权限)
var status = await Permissions.CheckStatusAsync<Permissions.LocationWhenInUse>();
if (status != PermissionStatus.Granted)
{
    status = await Permissions.RequestAsync<Permissions.LocationWhenInUse>();
}

if (status == PermissionStatus.Granted)
{
    var wifiService = DependencyService.Get<IWifiInfoService>();
    string activeWifiName = wifiService.GetActiveWifiName();
    // 这里处理拿到的WiFi名称
}

补充说明

  • 为什么旧代码失效:Android 9.0开始,ConnectivityManager.ActiveNetworkInfo.ExtraInfo对于WiFi网络不再返回SSID,官方推荐改用WifiManager.ConnectionInfo.Ssid来获取,但必须要有位置权限。
  • 权限申请可以用Xamarin.Essentials的Permissions API,它封装了不同平台的权限处理逻辑,比原生代码更简洁。

内容的提问来源于stack exchange,提问作者Manthiram

火山引擎 最新活动