Xamarin编程获取WiFi网络时遇ACCESS_WIFI_STATE权限错误求助
解决Xamarin中读取WiFi网络列表的权限错误
嘿,这个问题我之前做Xamarin Android项目时也碰到过!你看到的WifiService: Neither user 10059 nor current process has android.permission.ACCESS_WIFI_STATE错误,本质是权限配置没到位——尤其是Android 6.0(API Level 23)开始的运行时权限机制在起作用,光在清单里声明权限已经不够了,得走完整的权限申请流程。
下面一步步帮你搞定:
1. 先在AndroidManifest.xml里声明必要权限
除了ACCESS_WIFI_STATE,你还得加位置权限(这是API23+的硬性要求,系统认为WiFi信息可用于定位)。直接把这段代码加到你的清单文件里:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 要是不需要精确定位,换成ACCESS_COARSE_LOCATION也可以 --> <!-- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> -->
2. 在代码中动态申请权限
API23以上,危险权限(比如位置权限)必须在运行时向用户申请,不能只靠清单声明。你可以在调用WiFi相关逻辑前,先做权限检查和申请:
using Android.Content.PM; using Android.Support.V4.App; using Android.App; using Android.Widget; // 定义一个权限请求的标识码,随便设个整数就行 const int LocationPermissionRequestCode = 100; // 先检查权限,再获取WiFi列表 private void PrepareToGetWifiNetworks() { // 检查是否已经拿到位置权限 if (ContextCompat.CheckSelfPermission(this, Android.Manifest.Permission.AccessFineLocation) != Permission.Granted) { // 没权限就弹框向用户申请 ActivityCompat.RequestPermissions(this, new string[] { Android.Manifest.Permission.AccessFineLocation }, LocationPermissionRequestCode); return; } // 权限到手,直接读取WiFi网络 FetchWifiNetworks(); } private void FetchWifiNetworks() { WifiManager wifiManager = (WifiManager)Android.App.Application.Context.GetSystemService(Android.Content.Context.WifiService); var networks = wifiManager.ConfiguredNetworks; // 这里就可以处理拿到的网络列表啦 } // 处理用户对权限申请的回应 public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults) { base.OnRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == LocationPermissionRequestCode) { if (grantResults.Length > 0 && grantResults[0] == Permission.Granted) { // 用户同意了,重新执行WiFi读取逻辑 FetchWifiNetworks(); } else { // 用户拒绝了,得提示一下权限不足的问题 Toast.MakeText(this, "需要位置权限才能获取WiFi网络列表哦", ToastLength.Short).Show(); } } }
额外说明
为什么要位置权限?Android从API23开始,把WiFi相关的敏感操作和位置权限绑定了,因为WiFi热点的SSID、Mac地址这些信息可以用来定位用户,所以系统要求必须申请位置权限才能访问WiFi列表。
如果你是用Xamarin.Forms开发跨平台应用,那权限申请逻辑得放在Android项目的MainActivity里,或者通过依赖服务来封装,这样其他平台也能统一处理权限~
内容的提问来源于stack exchange,提问作者Gena Verdel
相关产品推荐
相关产品推荐

