Возникла проблема с «Java.Lang.SecurityException:« мое местоположение требует разрешения ACCESS_FINE_LOCATION или ACCESS_COARSE_LOCATION »» - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь получить местоположение пользователя на карте, но это удерживает меня в «режиме прерывания», и я не знаю, связана ли проблема с функцией «OnRequestPermissionsResult».

Это мой MainActivity.cs

using System;
using Android.App;
using Android.Content.PM;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using Environment = System.Environment;
using System.IO;

namespace TravelRecordApp.Droid
{
    [Activity(Label = "TravelRecordApp", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar;

            base.OnCreate(savedInstanceState);

            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
            Xamarin.FormsMaps.Init(this, savedInstanceState);

            string dbName = "travel_db.sqlite";
            string folderPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
            string fullPath = Path.Combine(folderPath, dbName);

            LoadApplication(new App(fullPath));
        }
        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
        {
            Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
}

И мой AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.companyname.travelrecordapp" android:installLocation="auto">
    <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <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_MOCK_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <application android:label="TravelRecordApp.Android">
        <meta-data android:name="com.google.android.geo.API_KEY" android:value="AIzaSyDNzCR_BT0ocNpQt_FYaDc7t_SOSFuanrM" />
    </application>
</manifest>

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

Я бы посоветовал вам проверить разрешение Runtime, используя собственный код, а не кроссплатформенное решение. У меня есть работающее решение для того же самого, что-то вроде следующего:

В вашем методе OnCreateпроверить существующие разрешения:

 if (!(CheckPermissionGranted(Manifest.Permission.AccessCoarseLocation) &&
            CheckPermissionGranted(Manifest.Permission.AccessFineLocation)))
        {
            RequestLocationPermission();
        }
        else
        {
            InitializeLocationManager();
        }
        InitPageWidgets();

Где Проверка разрешения Предоставлено - это метод, подобный следующему:

 [Export]
    public bool CheckPermissionGranted(string Permissions)
    {
        // Check if the permission is already available.
        if (ActivityCompat.CheckSelfPermission(this, Permissions) != Permission.Granted)
        {
            return false;
        }
        else
        {
            return true;
        }


    }

А код разрешения запроса выглядит примерно так:

  private void RequestLocationPermission()
    {
        if (ActivityCompat.ShouldShowRequestPermissionRationale(this, Manifest.Permission.AccessFineLocation))
        {
            // Provide an additional rationale to the user if the permission was not granted
            // and the user would benefit from additional context for the use of the permission.
            // For example if the user has previously denied the permission.
            ActivityCompat.RequestPermissions(this, PermissionsLocation, REQUEST_LOCATION);

        }
        else
        {
            // Camera permission has not been granted yet. Request it directly.
            ActivityCompat.RequestPermissions(this, PermissionsLocation, REQUEST_LOCATION);
        }
    }

Как только вы примете или отклоните это разрешение, будет вызван этот метод:

public override void OnRequestPermissionsResult(int requestCode, string[] permissions,
                     Android.Content.PM.Permission[] grantResults)
    {
        Log.Info(Tag, "onRequestPermissionResult");
        if (requestCode == RequestPermissionsRequestCode)
        {
            if (grantResults.Length <= 0)
            {
                // If user interaction was interrupted, the permission request is cancelled and you
                // receive empty arrays.
                Log.Info(Tag, "User interaction was cancelled.");
            }
            else if (grantResults[0] == PermissionChecker.PermissionGranted)
            {
                // Permission was granted.
                Service.RequestLocationUpdates();
            }
            else
            {
                // Permission denied.
                SetButtonsState(false);
                Toast.MakeText(this, "Permission Denied", ToastLength.Long).Show();
            }
        }
    }
0 голосов
/ 24 сентября 2019

если вы запрашиваете разрешение на выполнение, после Android6.0 вы должны запрашивать разрешение на выполнение и официальный документ

, вы можете использовать плагин nugetpackage .Permissions для запроса разрешений во время выполнения, обратитесь к Plugin.Permissions

, когда вам нужно запросить разрешение на размещение, которое вы можете сделать, например:

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

       status = await CrossPermissions.Current.RequestPermissionAsync<LocationPermission>();
    }

  if (status == PermissionStatus.Granted)
   {
    // do something you want
   }
  else if (status != PermissionStatus.Unknown)
   {
    //location denied
   }
}
catch (Exception ex)
 {
 //Something went wrong
 }

inВаша основная деятельность:

 public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
   {
     PermissionsImplementation.Current.OnRequestPermissionsResult(requestCode, permissions, grantResults);
     base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...