Сбой приложения при запросе разрешения местоположения у пользователей во время выполнения в Xamarin Android - PullRequest
0 голосов
/ 03 апреля 2019

Когда я перехожу на другую вкладку, я просто запрашиваю разрешение во время выполнения для местоположения (ACCESS_FINE_LOCATION), это приложение времени было сбой.

private void RequestPermissions()
        {
            try
            {
                bool shouldProvideRationale = Android.Support.V4.App.ActivityCompat.ShouldShowRequestPermissionRationale(Activity, Manifest.Permission.AccessFineLocation);

                if (shouldProvideRationale)
                {
                    Log.Info(Tag, "Displaying permission rationale to provide additional context.");
                }
                else
                {
                    Android.Support.V4.App.ActivityCompat.RequestPermissions(Activity, new String[] { Manifest.Permission.AccessFineLocation }, 1);
                    Log.Info(Tag, "Requesting permission");
                    // StartLocationPermissionRequest();
                }
            }
}

Мне нужно, чтобы всплывающее окно оставалось до тех пор, пока я не отвечу на это разрешение.

Ответы [ 2 ]

0 голосов
/ 04 апреля 2019

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

В вашем методе 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 голосов
/ 03 апреля 2019

Вы объявили разрешение в Манифесте?Если нет, перейдите в AndroidManifest.xml и добавьте: <использование-разрешения android: name = "android.permission.ACCESS_FINE_LOCATION" />

...