You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:31:42