webentwicklung-frage-antwort-db.com.de

Standortberechtigung für Android über 6.0 mit Xamarin.Forms.Maps

Ich versuche, eine Xamarin.Forms-Anwendung mit Xamarin.Forms.Maps zu implementieren, aber ich falle immer in die Ausnahme:

Java.Lang.SecurityException: Für meinen Standort ist die Berechtigung ACCESS_FINE_LOCATION oder ACCESS_COARSE_LOCATION erforderlich

Ich habe bereits versucht, die Schritte in diesem Tutorial auszuführen https://blog.xamarin.com/requesting-runtime-permissions-in-Android-Marshmallow/ , habe aber keine Ergebnisse erzielt.

Wäre mir jemand konsequenter behilflich?

Ich beabsichtige, eine Anwendung zu verwenden, die sehr nah an Uber liegt, und ich kann nicht weiterkommen, wenn ich die Standortberechtigungen nicht erhalte.

Meine MainPage sieht in meiner PCL so aus:

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

Meine MainActivity-Klasse in Xamarin.Android sieht folgendermaßen aus:

[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 ();
            }
        }
    };
8

Standortberechtigung für Android über 6.0 mit Xamarin.Forms.Maps

Sie haben viel Code über die Berechtigung geschrieben, aber ich kann nicht finden, wo Sie die Berechtigung anfordern. Sie müssen die Berechtigung anfordern, bevor Sie sie verwenden.

Wenn Sie die Eigenschaft IsShowingUser auf true setzen, müssen Sie zuerst die Berechtigung anfordern. Hier sind drei Lösungen.

Lösung 1:

Ich stelle fest, dass Sie PermissionsPlugin in Ihrem Code verwenden. Wenn Sie diese Berechtigung in PCL anfordern müssen, können Sie auf das PermissionsPlugin-Beispiel verweisen.

Fügen Sie diesen Code in Ihr MainActivity ein:

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults)
{
    PermissionsImplementation.Current.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}

Fordern Sie die Erlaubnis an, wenn Sie sie brauchen:

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)
{
    //...
}

Lösung 2:

Fordern Sie beim Öffnen Ihrer Anwendung zuerst die Berechtigung in der MainActivityOnStart -Methode an:

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!!!");
    }
}

Lösung 3:

Verwenden Sie DependencyService , um die Berechtigung bei Bedarf anzufordern. Hier ist das Beispiel , das sich auf das Lernprogramm bezieht, das Sie gelesen haben. In diesem Beispiel wird beim Ausführen dieser Zeile die Berechtigung angefordert:

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

fügen Sie dies in Android MainActiviy OnCreate ()

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

füge dies zu Android mainactivity hinzu:

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

dann funktioniert dieser Code und fordert den Benutzer zur Standorterlaubnis auf.

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

beziehen auf:

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

4
pollaris

Stellen Sie sicher, dass Sie alle erforderlichen Berechtigungen festgelegt haben. Wenn Sie Xamarin.Forms.Maps Für Android verwenden möchten, stellen Sie sicher, dass Sie die folgenden Berechtigungen in der AndroidManifest.xml - Datei Ihres Projekts festgelegt haben:

<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" />

Sie können die Berechtigungen auch festlegen, indem Sie mit der rechten Maustaste auf Ihr Projekt Android klicken und Properties auswählen. Gehen Sie zur Registerkarte Android Manifest Und markieren Sie alle erforderlichen Berechtigungen.

Stellen Sie außerdem sicher, dass Sie die folgenden zwei Anweisungen im Anwendungstag hinzugefügt haben:

<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" />
1

Dieses Video kann Ihnen helfen, die Laufzeitberechtigung in Xamarin-Formularen zu erhalten https://www.youtube.com/watch?v=IWdpzpFChUQ

1
Vidhya