CheckPermissionsAsync始终在Android上返回拒绝

Pau*_*els 5 c# android xamarin xamarin.forms

我正在使用权限插件来请求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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:

在进一步调查中,呼叫RequestPermissionsAsync似乎没有任何区别。我的印象是它将转到本机平台并显示“我们需要权限..”对话框。再次查看该插件示例,似乎答案是仅显示设置并让用户分配他们的想法;答案似乎差不多。感觉很像我在这里错过了难题的关键部分。

编辑:

我创建了这个问题的基本复制在这里(很明显,我已经删除了谷歌地图键)。

编辑:

遵循@FreakyAli的建议,我最终完成了一个(或多或少)如下所示的主要活动:

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

}
else
{                    
    ActivityCompat.RequestPermissions(this,
            new String[] { Manifest.Permission.AccessFineLocation },
            PERMISSIONS_REQUEST_LOCATION);    
}
Run Code Online (Sandbox Code Playgroud)

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

Che*_*SFT 3

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

 Plugin.CurrentActivity.CrossCurrentActivity.Current.Init(this, savedInstanceState);
Run Code Online (Sandbox Code Playgroud)
  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());
        }
    }
Run Code Online (Sandbox Code Playgroud)
  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);
    }
    
    Run Code Online (Sandbox Code Playgroud)

4. 在 Activity 的 OnCreate 方法中设置以下内容。

 Plugin.CurrentActivity.CrossCurrentActivity.Current.Init(this, savedInstanceState);
Run Code Online (Sandbox Code Playgroud)