C# 如何在Xamarin.Android中请求权限?

C# 如何在Xamarin.Android中请求权限?,c#,android,forms,xamarin,xamarin.android,C#,Android,Forms,Xamarin,Xamarin.android,我一直在stackoverflow和Xamarin论坛上搜索,但我找到的所有代码都不起作用。大多数关键字都会出现错误:“x在当前上下文中不存在”,我找不到包含它们的命名空间或库。我是Xamarin的新手,如果这是个愚蠢的问题,我很抱歉 您可以删除项目中的文件夹bin和obj,然后重新构建并重新构建它 对于请求权限,您可以从nuget安装插件plugin.Permissions 用法 试试看 { var status=await CrossPermissions.Current.CheckPerm

我一直在stackoverflow和Xamarin论坛上搜索,但我找到的所有代码都不起作用。大多数关键字都会出现错误:“x在当前上下文中不存在”,我找不到包含它们的命名空间或库。我是Xamarin的新手,如果这是个愚蠢的问题,我很抱歉

您可以删除项目中的文件夹
bin
obj
,然后重新构建并重新构建它

对于请求权限,您可以从nuget安装插件plugin.Permissions

用法
试试看
{
var status=await CrossPermissions.Current.CheckPermissionStatusAsync();
if(status!=PermissionStatus.grated)
{
if(wait CrossPermissions.Current.shouldShowRequestPermissionOriginaleAsync(Permission.Location))
{
//古纳需要那个位置
}
status=wait CrossPermissions.Current.RequestPermissionAsync();
}
if(status==PermissionStatus.grated)
{
//查询权限
}
else if(状态!=PermissionStatus.Unknown)
{
//位置被拒绝
}
}
捕获(例外情况除外)
{
//出了点问题
}
有关该插件的更多详细信息,请查看

注意

如果遵循此操作,则不必添加任何额外插件,下面的示例显示了如何处理位置权限

在OnCreate方法中,检查现有权限:

 if (!(CheckPermissionGranted(Manifest.Permission.AccessCoarseLocation) &&
            CheckPermissionGranted(Manifest.Permission.AccessFineLocation)))
        {
            RequestLocationPermission();
        }
        else
        {
            InitializeLocationManager();
        }
        InitPageWidgets();
其中授予检查权限的方法如下:

 [Export]
    public bool CheckPermissionGranted(string Permissions)
    {
        // Check if the permission is already available.
        if (ActivityCompat.CheckSelfPermission(this, Permissions) != Permission.Granted)
        {
            return false;
        }
        else
        {
            return true;
        }


    }
  private void RequestLocationPermission()
    {
        if (ActivityCompat.ShouldShowRequestPermissionRationale(this, Manifest.Permission.AccessFineLocation))
        {
            // Provide an additional rationale to the user if the permission was not granted
            // and the user would benefit from additional context for the use of the permission.
            // For example if the user has previously denied the permission.
            ActivityCompat.RequestPermissions(this, PermissionsLocation, REQUEST_LOCATION);

        }
        else
        {
            // Camera permission has not been granted yet. Request it directly.
            ActivityCompat.RequestPermissions(this, PermissionsLocation, REQUEST_LOCATION);
        }
    }
请求权限代码如下所示:

 [Export]
    public bool CheckPermissionGranted(string Permissions)
    {
        // Check if the permission is already available.
        if (ActivityCompat.CheckSelfPermission(this, Permissions) != Permission.Granted)
        {
            return false;
        }
        else
        {
            return true;
        }


    }
  private void RequestLocationPermission()
    {
        if (ActivityCompat.ShouldShowRequestPermissionRationale(this, Manifest.Permission.AccessFineLocation))
        {
            // Provide an additional rationale to the user if the permission was not granted
            // and the user would benefit from additional context for the use of the permission.
            // For example if the user has previously denied the permission.
            ActivityCompat.RequestPermissions(this, PermissionsLocation, REQUEST_LOCATION);

        }
        else
        {
            // Camera permission has not been granted yet. Request it directly.
            ActivityCompat.RequestPermissions(this, PermissionsLocation, REQUEST_LOCATION);
        }
    }
接受或拒绝此权限后,将调用此方法:

public override void OnRequestPermissionsResult(int requestCode, string[] permissions,
                     Android.Content.PM.Permission[] grantResults)
    {
        Log.Info(Tag, "onRequestPermissionResult");
        if (requestCode == RequestPermissionsRequestCode)
        {
            if (grantResults.Length <= 0)
            {
                // If user interaction was interrupted, the permission request is cancelled and you
                // receive empty arrays.
                Log.Info(Tag, "User interaction was cancelled.");
            }
            else if (grantResults[0] == PermissionChecker.PermissionGranted)
            {
                // Permission was granted.
                Service.RequestLocationUpdates();
            }
            else
            {
                // Permission denied.
                SetButtonsState(false);
                Toast.MakeText(this, "Permission Denied", ToastLength.Long).Show();
            }
        }
    }
public override void OnRequestPermissionsResult(int-requestCode,字符串[]权限,
Android.Content.PM.Permission[]grantResults)
{
Log.Info(标记“onRequestPermissionResult”);
if(requestCode==RequestPermissionsRequestCode)
{

如果(grantResults.Length嗨,首先请编写代码,而不是发布屏幕截图,其次请共享您的清单。xmlplease read before postingI查看插件,它似乎不支持读取外部存储和写入外部存储。这些是我需要的权限。抱歉,我没有指定,我认为它工作原理相同在名为
StoragePermission
的插件中。哦,好吧,我没有注意到我认为我缺少了一个名称空间或其他东西,(这在MainActivity.cs中)Manifest、InitializeLocationManager、InitPageWidgets和ActivityCompat都抛出了错误:“x在当前上下文中不存在”是的,因为这些是伪方法,它们不存在,它们只是让您了解需要做什么,您需要的唯一名称空间是使用Android.Support.V4.App;