首页 > 解决方案 > CheckPermissionsAsync 在 Android 上总是返回 Denied

问题描述

我正在使用权限插件在 Android 上请求良好的位置权限;但是,每次我调用 CheckPermissionsAsync 时,都会收到拒绝响应。这是我正在使用的代码:

protected override async void OnStart()
{
    PermissionStatus status = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.LocationWhenInUse);
    if (status == PermissionStatus.Unknown)
    {
        var result = await CrossPermissions.Current.RequestPermissionsAsync(Permission.LocationWhenInUse);
    }
}

这是在模拟器上运行的,据我所知,我还没有设法执行RequestPermissionsAsync调用。

这是预期的行为吗?如果是这样,我如何区分拒绝(尚未询问)和拒绝(询问并拒绝)?

编辑:

在进一步调查中,无论哪种方式,呼叫RequestPermissionsAsync似乎都没有任何区别。我的印象是它会转到原生平台并显示“我们需要权限..”对话框。再看一下这个插件的样本,答案似乎就是只显示设置并让用户分配他们感觉的任何东西;感觉很像我在这里错过了难题的关键部分。

编辑:

我在这里创建了该问题的基本副本(显然我已经删除了 Google Maps 键)。

编辑:

按照@FreakyAli 的建议,我最终得到了一个看起来像这样(或多或少)的主要活动:

if (ActivityCompat.ShouldShowRequestPermissionRationale(this,
        Manifest.Permission.AccessFineLocation))
{

}
else
{                    
    ActivityCompat.RequestPermissions(this,
            new String[] { Manifest.Permission.AccessFineLocation },
            PERMISSIONS_REQUEST_LOCATION);    
}

这行得通,但感觉就像我在复制插件的功能。

标签: c#androidxamarinxamarin.forms

解决方案


请确保您在 Activity OnCreate 方法中添加了以下代码:

 Plugin.CurrentActivity.CrossCurrentActivity.Current.Init(this, savedInstanceState);
  1. 向清单文件添加位置权限。

2.查看权限状态,请求权限。

  private async void Btn1_Click(object sender, System.EventArgs e)
    {
        var status = PermissionStatus.Unknown;
        try
        {
             status = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Location);
            if (status != PermissionStatus.Granted)
            {
                if (await CrossPermissions.Current.ShouldShowRequestPermissionRationaleAsync(Permission.Location))
                {
                    Console.WriteLine("Need location", "Gunna need that location", "OK");

                }

                var results = await CrossPermissions.Current.RequestPermissionsAsync(Permission.Location);
                status = results[Permission.Location];
            }

            if (status == PermissionStatus.Granted)
            {
               //do something about location.
            }
            else if (status != PermissionStatus.Unknown)
            {
                Console.WriteLine("Location Denied", "Can not continue, try again.", "OK");
            }
        }
        catch (Exception ex)
        {

            Console.WriteLine(ex.ToString());
        }
    }
  1. 覆盖 OnRequestPermissionsResult 方法。

     public override void OnRequestPermissionsResult(int requestCode, string[] 
        permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
    {
        base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        Plugin.Permissions.PermissionsImplementation.Current.OnRequestPermissionsResult(requestCode, permissions, grantResults);
    }
    

4.在您的活动的 OnCreate 方法中设置以下内容。

 Plugin.CurrentActivity.CrossCurrentActivity.Current.Init(this, savedInstanceState);

推荐阅读