请求类中的Android权限(Xamarin)
我正在尝试在运行时为我的应用请求权限。我使用服务提供商在portable类和Android之间进行对话 我首先在PCL中的按钮按下时调用此代码:请求类中的Android权限(Xamarin),xamarin,xamarin.android,Xamarin,Xamarin.android,我正在尝试在运行时为我的应用请求权限。我使用服务提供商在portable类和Android之间进行对话 我首先在PCL中的按钮按下时调用此代码: using (new Busy(this)) { var locationHelper = scope.Resolve<ILocationHelper>(); locationHelper.GetLocation(this);
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包。那么,你可以自己实现同样的逻辑:)…只需跟踪当前的活动。