Не удается найти разрешение «ACCESS_BACKGROUND_LOCATION» в коде Android Xamarin. Мне нужно проверить, предоставил ли пользователь это разрешение - PullRequest
0 голосов
/ 15 октября 2019

Я пытаюсь проверить, выбрал ли пользователь опцию «Разрешить только во время использования приложения», когда запрашивается разрешение «Расположение» на устройствах Android-10 в Xamarin.

Я обновил свой Android SDK до последней версии, а также обновил Visual Studio всеми другими моно-пакетами. Я пытался установить целевую версию Api 29 (Android 10), но все равно не повезло.

В нативном коде Android (JAVA или Kotlin) он прост и доступен, например,

val hasBackgroundLocationPermission = ActivityCompat.checkSelfPermission (this, Manifest.permission.ACCESS_BACKGROUND_LOCATION) == PackageManager *PERMISSION7GRANT *Я хочу добиться того же в Xamarin android (C #)

Я ожидаю, что я должен получить это разрешение (ACCESS_BACKGROUND_LOCATION) в коде. Но я не вижу, что это еще доступно в Xamarin.

Ответы [ 3 ]

1 голос
/ 15 октября 2019

Разрешение ACCESS_BACKGROUND_LOCATION является новым после Android 10.0. Даже если вы установили целевую версию Api 29, но версия SDK поддержки в Xamarin.Android по-прежнему v28.xxx (Android 9.0). Так что это перечисление все еще недоступно в Xamarin.Android сейчас. Вам просто нужно дождаться обновления SDK поддержки.

enter image description here

В вашем случае ACCESS_BACKGROUND_LOCATION будет совместимо со старымверсияЕсли приложение подает заявку на ACCESS_FINE_LOCATION или ACCESS_COARSE_LOCATION , система автоматически добавит разрешение ACCESS_BACKGROUND_LOCATION во время сборки.

Аналогично, если приложение запрашивает ACCESS_FINE_LOCATION или ACCESS_COARSE_LOCATION , система автоматически добавляет ACCESS_BACKGROUND_LOCATION к запросу.

0 голосов
/ 15 октября 2019

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

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

 if (!(CheckPermissionGranted(Manifest.Permission.AccessCoarseLocation) 
         &&(CheckPermissionGranted(Manifest.Permission.AccessBackgroundLocation) 
         && 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.

            }
            else
            {
                // Permission denied.

                Toast.MakeText(this, "Permission Denied", ToastLength.Long).Show();
            }
        }
    }

Обратите внимание, что это доступно только в последней версии Xamarin с VS 2019

0 голосов
/ 15 октября 2019

Я думаю, вам нужно обработать разрешения на платформе Xamarin. Что-то вроде:

await CrossGeolocator.Current.StartListeningAsync(TimeSpan.FromSeconds(5), 10, true, new Plugin.Geolocator.Abstractions.ListenerSettings
                {
                    ActivityType = Plugin.Geolocator.Abstractions.ActivityType.AutomotiveNavigation,
                    AllowBackgroundUpdates = true,
                    DeferLocationUpdates = true,
                    DeferralDistanceMeters = 1,
                    DeferralTime = TimeSpan.FromSeconds(1),
                    ListenForSignificantChanges = true,
                    PauseLocationUpdatesAutomatically = false
                });

Я не профессионал в Xamarin, но я думаю, что это может быть решением для вас, и с помощью этого плагина вы также можете проверить, предоставляет ли пользователь разрешения или нет

...