使用Xamarin.Forms.Maps,Android的位置权限高于6.0

时间:2018-01-28 14:20:11

标签: c# xamarin xamarin.forms xamarin.android

我尝试使用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中看起来像这样:

class()

Xamarin.Android中的我的MainActivity类看起来像这样:

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;
        }
    }

4 个答案:

答案 0 :(得分:16)

  

使用Xamarin.Forms.Maps

支持Android的6.0以上的位置权限

您写了很多关于权限的代码,但我无法找到您申请权限的位置,您需要在使用之前请求权限。

当您将IsShowingUser属性设置为true时,您应首先请求权限,这里有三个解决方案。

解决方案1:

我注意到您在代码中使用documentation,如果您需要在PCL中申请此权限,则可以参考PermissionsPlugin

MainActivity

中添加此代码
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults)
{
    PermissionsImplementation.Current.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}

在您需要时请求权限:

try
{
    var status = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Location);
    if (status != PermissionStatus.Granted)
    {
        if(await CrossPermissions.Current.ShouldShowRequestPermissionRationaleAsync(Permission.Location))
        {
            await DisplayAlert("Need location", "Gunna need that location", "OK");
        }

        var results = await CrossPermissions.Current.RequestPermissionsAsync(Permission.Location);
        status = results[Permission.Location];
     }

     if (status == PermissionStatus.Granted)
     {
         //Permission granted, do what you want do.
     }
     else if(status != PermissionStatus.Unknown)
     {
         await DisplayAlert("Location Denied", "Can not continue, try again.", "OK");
     }
}
catch (Exception ex)
{
    //...
}

解决方案2:

当您打开应用程序时,请先使用MainActivity OnStart方法请求权限:

protected override void OnStart()
{
    base.OnStart();

    if (ContextCompat.CheckSelfPermission(this, permission) != Permission.Granted)
    {
        ActivityCompat.RequestPermissions(this, new String[] { Manifest.Permission.AccessCoarseLocation, Manifest.Permission.AccessFineLocation }, 0);
    }
    else
    {
        System.Diagnostics.Debug.WriteLine("Permission Granted!!!");
    }
}

解决方案3:

使用PermissionsPlugin official sample在您需要时请求权限,这是与您已阅读的DependencyService相关的sample。在此示例中,它在执行此行时请求权限:

buttonGetLocation.Click += async (sender, e) => await TryGetLocationAsync();

答案 1 :(得分:4)

将此内容添加到android MainActiviy OnCreate()

Plugin.CurrentActivity.CrossCurrentActivity.Current.Activity = this;

将此添加到android mainactivity中:

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Android.Content.PM.Permission[] grantResults)
{
    Plugin.Permissions.PermissionsImplementation.Current.OnRequestPermissionsResult(requestCode, permissions, grantResults);
    base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}

然后此代码将起作用,提示用户输入位置权限。

                var locator = CrossGeolocator.Current;
                locator.DesiredAccuracy = 1000;
                var position = await locator.GetPositionAsync(timeoutMilliseconds: 10000);

请参阅:

https://jamesmontemagno.github.io/GeolocatorPlugin/

答案 2 :(得分:1)

确保您已设置所有必要的权限。如果您想在Android上使用Xamarin.Forms.Maps,请确保您在项目的AndroidManifest.xml文件中设置了以下权限:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />

您还可以通过在Android项目上单击鼠标右键并选择Properties来设置权限。转到标签Android Manifest并标记所有必要的权限。

还要确保在应用程序标记中添加了以下两个语句:

<meta-data android:name="com.google.android.geo.API_KEY" android:value="ADD_YOUR_KEY_HERE" />
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />

答案 3 :(得分:0)

此视频可以帮助您以xamarin形式获得运行时权限 https://www.youtube.com/watch?v=IWdpzpFChUQ

相关问题