Xamarin.Android调用ScanResult.WifiStandard报NoSuchMethodError求助
问题根因
这个报错不是Xamarin/微软侧的组件缺陷,原因是WifiStandard属性对应的Android原生ScanResult.getWifiStandard()方法是Android 11(API Level 30)才新增的API,你测试用的设备搭载的是Android 8.0(API Level 26),系统底层不存在该方法,所以直接调用就会抛出NoSuchMethodError链接错误。
修复方案
1. 新增API版本兼容判断
首先在调用WifiStandard前先判断当前设备的系统版本,只有符合要求才直接调用该属性:
public override void OnReceive(Context ctx, Intent intent) { creator.current_wifi_list = wifiManager.ScanResults.Select(p => { WifiStandard standard; if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.R) { standard = (WifiStandard)p.WifiStandard; } else { standard = GetWifiStandardByFrequency(p.Frequency); } return new wifiInfo(p.Bssid.ToUpper(), p.Ssid, p.Level, standard); }).ToList(); }
2. 低版本替代实现(通过频段判断WiFi标准)
低版本系统可以通过ScanResult.Frequency字段判断对应的WiFi标准,实现方法参考:
private WifiStandard GetWifiStandardByFrequency(int frequency) { if (frequency >= 2400 && frequency < 2500) { // 2.4G频段 一般为WiFi4(802.11b/g/n) return WifiStandard.WifiStandard11n; } else if (frequency >= 5150 && frequency < 5850) { // 5G频段 一般为WiFi5(802.11ac) return WifiStandard.WifiStandard11ac; } else if (frequency >= 5925 && frequency < 7125) { // 6G频段 一般为WiFi6及以上 return WifiStandard.WifiStandard11ax; } // 未知频段默认返回未知 return WifiStandard.WifiStandardUnknown; }
如果你的wifiInfo类里自定义了WiFi标准枚举,替换返回值为你自己的枚举值即可。
额外注意事项
如果你的应用目标SDK版本低于30,Xamarin的绑定库可能也不会暴露WifiStandard属性,此时需要先将项目的目标Android版本升级到Android 11及以上,编译阶段才不会报错。
内容的提问来源于stack exchange,提问作者Alex A.
相关产品推荐
相关产品推荐

