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

Xamarin Essentials Permissions.RequestAsync调用无返回致应用卡顿

解决Xamarin.Essentials中Permissions.RequestAsync阻塞卡顿问题

核心原因及修复方案

1. 避免同步阻塞异步方法导致死锁

如果CheckPermissions被同步代码(如Wait()/.Result)调用,会占用UI线程,导致权限回调无法处理,最终阻塞RequestAsync。

修复方式:

  • 始终用await异步调用CheckPermissions,禁止同步阻塞:
    // 在异步方法内正确调用
    await CheckPermissions();
    
  • 若需脱离UI上下文执行权限检查,添加ConfigureAwait(false),并通过主线程更新UI字段:
    public async Task CheckPermissions()
    {
        var status = await Permissions.CheckStatusAsync<Permissions.LocationWhenInUse>().ConfigureAwait(false);
    
        if (status != PermissionStatus.Granted)
        {
            status = await Permissions.RequestAsync<Permissions.LocationWhenInUse>().ConfigureAwait(false);
        }
    
        // 回到UI线程更新权限状态字段
        MainThread.BeginInvokeOnMainThread(() => 
        {
            HasLocationPermissions = status == PermissionStatus.Granted;
        });
    }
    

2. 确认Android权限声明完整

缺少权限声明会导致权限请求无响应,需在AndroidManifest.xml中添加对应权限:

<!-- 基础定位权限 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

<!-- Android 10+ 后台定位权限(按需添加) -->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

3. 验证MainActivity权限回调实现

确保OnRequestPermissionsResult优先调用Xamarin.Essentials的处理逻辑,且Activity继承自AppCompatActivity:

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Permission[] grantResults)
{
    // 必须优先处理Xamarin.Essentials的权限回调
    Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
    base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}

4. 清除应用缓存重置权限状态

系统权限缓存可能引发异常,可尝试:

  • 卸载并重新安装应用
  • 清除应用权限设置后重新运行

内容的提问来源于stack exchange,提问作者Stephan Häberle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 15:16:01