Search code examples
c#xamaringeolocationandroid-permissions

Background Location does not work in android 11


I have a mobile application written in Xamarin and the class that ask for permission looks like this

 public class AppPermissionsManager
    {
        private readonly string[] _permissions =
        {
            Manifest.Permission.AccessCoarseLocation,
            Manifest.Permission.AccessFineLocation,
            Manifest.Permission.AccessLocationExtraCommands,
            Manifest.Permission.AccessNetworkState,
            Manifest.Permission.AccessWifiState,
            Manifest.Permission.Camera,
            Manifest.Permission.Internet,
            Manifest.Permission.ReadPhoneState,
            Manifest.Permission.ReadExternalStorage,
            Manifest.Permission.WriteExternalStorage
        };

        private readonly string[] _androidQPermissions =
        {
            Manifest.Permission.AccessCoarseLocation,
            Manifest.Permission.AccessFineLocation,
            Manifest.Permission.AccessLocationExtraCommands,
            Manifest.Permission.AccessNetworkState,
            Manifest.Permission.AccessWifiState,
            Manifest.Permission.Camera,
            Manifest.Permission.Internet,
            Manifest.Permission.ReadPhoneState,
            Manifest.Permission.ReadExternalStorage,
            Manifest.Permission.WriteExternalStorage,
            Manifest.Permission.AccessBackgroundLocation
        };

        public static int RequestLocationId = 0;

        public bool CheckPermissions()
        {
            string[] permissions = GetPermissions();

            foreach (var permission in permissions)
            {
                if (ContextCompat.CheckSelfPermission(Android.App.Application.Context, permission) != (int)Permission.Granted)
                {
                    return false;
                }
            }

            return true;
        }

        private string[] GetPermissions()
        {
            return Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.Q ? _androidQPermissions : _permissions;
        }

        public void RequestPermissions()
        {
            try
            {
                var permissions = GetPermissions();

                Activity activity = CrossCurrentActivity.Current.Activity;
                ActivityCompat.RequestPermissions(activity, permissions, RequestLocationId);
            }
            catch (Exception ex)
            {
                LoggingHelper.LogError(ex, nameof(AppPermissionsManager), MethodBase.GetCurrentMethod().Name);
            }
        }
    }

My problem is that AccessBackgroundLocation does not work on Android 11 (when the user opens the app, a blank page appears and no error is logged). If I remove the AccessBackgroundLocation, the app works fine (except for the background location functionality)


Solution

  • Background Location Restrictions Android 11+ API 30+

    In order to access background location user must enable permissions from Settings page.

    EDIT

    With the help of @lee-m in the comments, the answer to your question is that in Android 11+, when you ask for Foreground and Background location at the same time, android will ignore this request and will not grant permission for either one.

    Firstly you need Foreground location access, and then Backgroud. If you really need Background location you need to prompt your user to enable Allow all the time from the Settings page of your Application.