コード例 #1
0
        static AccessState FromResult(PermissionRequestResult results, LocationPermissionType locType)
        {
            AccessState status;
            var         coarse = results.IsGranted(P.AccessCoarseLocation);

            if (locType != LocationPermissionType.Coarse)
            {
                var fine = results.IsGranted(P.AccessFineLocation);
                if (!coarse && !fine)
                {
                    status = AccessState.Denied;
                }

                else if (fine)
                {
                    status = AccessState.Available;
                }

                else if (locType == LocationPermissionType.FineRequired)
                {
                    status = AccessState.Denied;
                }

                else
                {
                    status = AccessState.Restricted;
                }
            }
            else
            {
                status = coarse ? AccessState.Available : AccessState.Denied;
            }
            return(status);
        }
コード例 #2
0
        public static async Task <AccessState> RequestBackgroundLocationAccess(this IAndroidContext context, LocationPermissionType locType)
        {
            if (!context.IsLocationEnabled(false, false))
            {
                return(AccessState.Disabled);
            }

            context.AssertBackgroundInManifest();

            AccessState status;

            if (context.IsMinApiLevel(30))
            {
                // Android 11+ need to request background separately
                // Android 12+ user can decline fine, but allow coarse
                status = await context.RequestLocationAccess(locType);

                if (status == AccessState.Available || status == AccessState.Restricted)
                {
                    var bg = await context.RequestAccess(P.AccessBackgroundLocation).ToTask();

                    status = bg == AccessState.Available ? status : AccessState.Restricted;
                }
            }
            else if (context.IsMinApiLevel(29))
            {
                // Android 10: Request BG permission with other permissions
                var perms = new List <string> {
                    P.AccessBackgroundLocation, P.AccessCoarseLocation
                };
                if (locType != LocationPermissionType.Coarse)
                {
                    perms.Add(P.AccessFineLocation);
                }

                var results = await context
                              .RequestPermissions(perms.ToArray())
                              .ToTask();

                status = FromResult(results, locType);
                if (status == AccessState.Available || status == AccessState.Available)
                {
                    status = results.IsGranted(P.AccessBackgroundLocation) ? status : AccessState.Restricted;
                }
            }
            else
            {
                status = await context.RequestLocationAccess(locType);
            }
            return(status);
        }
コード例 #3
0
        public static async Task <AccessState> RequestLocationAccess(this IAndroidContext context, LocationPermissionType locType)
        {
            if (!context.IsLocationEnabled(false, false))
            {
                return(AccessState.Disabled);
            }

            var perms = new List <string> {
                P.AccessCoarseLocation
            };

            if (locType != LocationPermissionType.Coarse)
            {
                perms.Add(P.AccessFineLocation);
            }

            var results = await context.RequestPermissions(perms.ToArray()).ToTask();

            var status = FromResult(results, locType);

            return(status);
        }