【发布时间】:2018-01-28 14:20:11
【问题描述】:
我正在尝试使用 Xamarin.Forms.Maps 实现 Xamarin.Forms 应用程序,但是我总是陷入异常:
Java.Lang.SecurityException:我的位置需要权限 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION
我已经尝试按照本教程https://blog.xamarin.com/requesting-runtime-permissions-in-android-marshmallow/ 中的步骤进行操作,但没有得到结果。
有没有人有更一致的东西可以帮助我?
我打算使用一个非常接近优步的应用程序,如果我无法获得位置权限,我就无法进步。
我的主页面在我的 PCL 中如下所示:
public partial class MainPage: ContentPage
{
public MainPage ()
{
InitializeComponent ();
var map = new Map ()
{
MapType = MapType.Street,
IsShowingUser = true
};
var stack = new StackLayout {Spacing = 0};
stack.Children.Add (map);
Content = stack;
}
}
我在 Xamarin.Android 中的 MainActivity 类如下所示:
[Activity (Label = "ExampleGeolocation", Icon = "@ drawable / icon",
Theme = "@ style / MainTheme", MainLauncher = true,
ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity: global :: Xamarin.Forms.Platform.Android.FormsAppCompatActivity, ActivityCompat.IOnRequestPermissionsResultCallback
{
View layout;
const int RequestLocationId = 0;
readonly string [] PermissionsLocation = {Manifest.Permission.AccessCoarseLocation, Manifest.Permission.AccessFineLocation};
protected override void OnCreate (Bundle bundle)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate (bundle);
global :: Xamarin.Forms.Forms.Init (this, bundle);
global :: Xamarin.FormsMaps.Init (this, bundle);
Plugin.CurrentActivity.CrossCurrentActivity.Current.Activity = this;
SetStatusBarColor (Android.Graphics.Color.Black);
LoadApplication (new App ());
}
public override async void OnRequestPermissionsResult (int requestCode, string [] permissions, [GeneratedEnum] Permission [] grantResults)
{
switch (requestCode)
{
case RequestLocationId:
{
if (grantResults [0] == Permission.Granted)
{
var snack = Snackbar.Make (layout, "Location Permission is Available.", Snackbar.LengthShort);
snack.Show ();
await GetLocationAsync ();
}
else
{
var snack = Snackbar.Make (layout, "Location Permission Denied", Snackbar.LengthShort);
snack.Show ();
}
}
break;
}
}
async Task TryGetLocationAsync ()
{
if ((int) Build.VERSION.SdkInt <23)
{
await GetLocationAsync ();
return;
}
await GetLocationPermissionAsync ();
}
async Task GetLocationPermissionAsync ()
{
const string permission = Manifest.Permission.AccessFineLocation;
if (CheckSelfPermission (permission) == Permission.Granted)
{
await GetLocationAsync ();
return;
}
if (ShouldShowRequestPermissionRationale (permission))
{
Snackbar.Make (layout, "You must allow the application to access your location options.", Snackbar.LengthIndefinite)
.SetAction ("OK", v => RequestPermissions (PermissionsLocation, RequestLocationId))
.Show();
return;
}
RequestPermissions (PermissionsLocation, RequestLocationId);
}
async Task GetLocationAsync ()
{
try
{
var locator = CrossGeolocator.Current;
}
catch (Exception e)
{
e.ToString ();
throw new NotImplementedException ();
}
}
};
【问题讨论】:
-
您是否将权限添加到清单中?另外在您的代码中的哪一点引发异常?
-
另外,当你写“我......没有得到结果”时,你是什么意思?你得到许可对话框了吗?您从 CheckSelfPermission 获得哪个返回码?请提供更多信息
-
我使用IsShowingUser属性=true时调用地图的代码
标签: c# xamarin xamarin.forms xamarin.android