请求类中的Android权限(Xamarin)

请求类中的Android权限(Xamarin),xamarin,xamarin.android,Xamarin,Xamarin.android,我正在尝试在运行时为我的应用请求权限。我使用服务提供商在portable类和Android之间进行对话 我首先在PCL中的按钮按下时调用此代码: using (new Busy(this)) { var locationHelper = scope.Resolve<ILocationHelper>(); locationHelper.GetLocation(this);

我正在尝试在运行时为我的应用请求权限。我使用服务提供商在portable类和Android之间进行对话

我首先在PCL中的按钮按下时调用此代码:

using (new Busy(this))
                {
                    var locationHelper = scope.Resolve<ILocationHelper>();
                    locationHelper.GetLocation(this);
                }
使用(新忙(此))
{
var locationHelper=scope.Resolve();
locationHelper.GetLocation(此);
}
这将调用我的Android级别服务:

public class AndroidLocationHelper : ILocationHelper, ILocationListener
    {

        readonly string[] PermissionsLocation =
        {
            Manifest.Permission.AccessCoarseLocation
        };
        const int RequestLocationId = 0;

public void GetLocation(SearchViewModel viewModel)
        {
            try
            {
                const string permission = Manifest.Permission.AccessCoarseLocation;
                if (((int)Build.VERSION.SdkInt < 23) || (CheckSelfPermission(permission) == Permission.Granted))
                {
                }
                else
                    RequestPermissions(PermissionsLocation, RequestLocationId);
            }
            catch (Exception ex)
            {
                Debug.WriteLine("Error while getting Location service");
                Debug.WriteLine(ex.Message);
                Messaging.AlertUser("There was an error with determining your location");
            }
        }
public类AndroidLocationHelper:ILocationHelper,ILocationListener
{
只读字符串[]权限位置=
{
Manifest.Permission.accessLocation
};
const int RequestLocationId=0;
public void GetLocation(SearchViewModel viewModel)
{
尝试
{
const string permission=Manifest.permission.accessLocation;
if((int)Build.VERSION.SdkInt<23)| |(CheckSelfPermission(permission)=permission.grated))
{
}
其他的
RequestPermissions(PermissionsLocation,RequestLocationId);
}
捕获(例外情况除外)
{
WriteLine(“获取位置服务时出错”);
Debug.WriteLine(例如消息);
Messaging.AlertUser(“确定您的位置时出错”);
}
}
但是,我在
CheckSelfPermission
RequestPermissions
上遇到了两个错误。这两种方法仅适用于活动。代码在
MainActivity
中工作正常;但是,我想在用户点击按钮时请求权限,而不是在
OnCreate
OnResume


谢谢您的帮助。

您可以尝试使用
ContextCompat.CheckSelfPermission
,传递应用程序上下文,如下所示:

ContextCompat.CheckSelfPermission(Android.App.Application.Context,permission)

更新


对于需要活动引用的
ActivityCompat.RequestPermissions
,您可以跟踪当前活动。有一个非常方便的库,称为“CurrentActivityPlugin”。您可以在

找到Rafael提出了一个解决方案,但我发现了另一个选择,只需使用
MessagingCenter
。在
MainActivity
OnCreate
中添加一个运行所有位置代码的接收器,这样您就可以访问所有活动方法(还有一系列关于在
MainActivity
中进行位置服务的教程)。然后将
Send
添加到您的服务(类)中。

在您的Android项目中,您可以使用它并使用依赖项服务在Xamarin中调用它。稍后,Forms PCL项目:

var thisActivity = Forms.Context as Activity;
ActivityCompat.RequestPermissions(thisActivity, new string[] { 
Manifest.Permission.AccessFineLocation }, 1);
ActivityCompat.RequestPermissions(thisActivity,
new String[] { Manifest.Permission.AccessFineLocation },
1);

为了解释Rafael Steil的答案,我尝试了建议的CurrentActivityPlugin,它对我起了作用。在我的例子中,我尝试执行一个需要call\u PHONE许可的语音呼叫。以下是您案例中的代码片段:我使用了ContextCompat&ActivityCompat,因此我不需要检查版本。SdkInt

        using Plugin.CurrentActivity;

        public void GetLocation(SearchViewModel viewModel){

           var context = CrossCurrentActivity.Current.AppContext; 
           var activity = CrossCurrentActivity.Current.Activity;
           int YOUR_ASSIGNED_REQUEST_CODE = 9;

           if (ContextCompat.CheckSelfPermission(context, Manifest.Permission.AccessCoarseLocation) == (int)Android.Content.PM.Permission.Granted)
           {
               //Permission is granted, execute stuff   
           }
           else
           {                
               ActivityCompat.RequestPermissions(activity, new string[] { Manifest.Permission.AccessCoarseLocation }, YOUR_ASSIGNED_REQUEST_CODE);
           }
        }
很简单

public bool CheckPermission()
    {
        const string permission = Manifest.Permission.ReceiveSms;
        return ContextCompat.CheckSelfPermission(Forms.Context, permission) == (int) Permission.Granted;
    }

看起来它在
CheckSelfPermission
上起作用,但是
RequestPermissions
需要类似于
ActivityCompat.RequestPermissions的东西(这个,PermissionsLocation,RequestLocationId)
。关于传递什么的任何想法,因为它需要一个活动,而不是上下文。你可以跟踪当前的活动。我使用这个方便的库:哈,我在设备级别上这样做的全部原因是避免使用额外的PCL nuget包。那么,你可以自己实现同样的逻辑:)…只需跟踪当前的活动。