Xamarin Android应用获取WiFi列表报空引用错误,求解决方案
空引用报错解决方法
核心报错原因
Btn1get_Clicked事件中DependencyService.Get<IWifi>()返回null,是触发空引用的首要原因,其次存在权限缺失、无空值防护等问题,按以下步骤修改即可:
1. 注册DependencyService实现
Xamarin.Forms的依赖服务需要显式注册才能被检索到,在安卓项目的Wifi类所在文件的命名空间外添加注册特性:
// 加在文件最顶部,using语句下方、namespace WifiApp.Droid上方 [assembly: Dependency(typeof(WifiApp.Droid.Wifi))] namespace WifiApp.Droid { // 原有Wifi类代码不变 }
2. 补全安卓权限配置
打开安卓项目的Properties/AndroidManifest.xml,添加以下权限声明:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
安卓6.0及以上版本需要动态申请定位权限,修改Btn1get_Clicked方法,先申请权限再执行扫描:
public async void Btn1get_Clicked(object sender, EventArgs e) { // 先申请定位权限 var status = await Permissions.CheckStatusAsync<Permissions.LocationWhenInUse>(); if (status != PermissionStatus.Granted) { status = await Permissions.RequestAsync<Permissions.LocationWhenInUse>(); if (status != PermissionStatus.Granted) { await DisplayAlert("提示", "需要位置权限才能扫描WiFi", "确定"); return; } } _wifiService = null; // 加判空避免空引用 var wifiService = DependencyService.Get<IWifi>(); if (wifiService == null) { await DisplayAlert("错误", "未找到WiFi服务实现", "确定"); return; } _wifiService = await wifiService.GetAvailableNetworksAsync(); wifilist.ItemsSource = _wifiService; }
3. 添加空值防护
修改WifiReceiver的OnReceive方法,对扫描结果做判空处理:
public override void OnReceive(Context context, Intent intent) { IList<ScanResult> scanwifinetworks = wifi.ScanResults; // 新增判空逻辑 if (scanwifinetworks == null) { receiverARE.Set(); return; } foreach (ScanResult wifinetwork in scanwifinetworks) { wifiNetworks.Add(wifinetwork.Ssid); } receiverARE.Set(); }
4. 额外适配注意事项
- 安卓10及以上版本需要开启设备定位功能才能扫描到WiFi列表,可提前判断定位是否开启,引导用户打开
- 安卓13(API 33)及以上版本需要新增
NEARBY_WIFI_DEVICES权限,可根据目标SDK版本补充声明
内容的提问来源于stack exchange,提问作者Shalin Gajjar
相关产品推荐
相关产品推荐

