如何在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




