【问题标题】:XamarinForms problem with code thas is OBSOLETEXamarin Forms 代码已过时的问题
【发布时间】:2021-08-06 05:52:39
【问题描述】:

我尝试使用 Xamarin.Forms 在我的应用中使用地图功能。

在这部分代码中,我获得了允许在地图中查看我的位置的权限。

[Obsolete]
private async void GetPermession()
{
        try
        {
            var status = await CrossPermissions.Current.CheckPermissionStatusAsync(Plugin.Permissions.Abstractions.Permission.LocationWhenInUse);
            //var status = await CrossPermissions.Current.CheckPermissionStatusAsync<LocationWhenInUsePermission>();

            if (status != Plugin.Permissions.Abstractions.PermissionStatus.Granted)
            {
                if (await CrossPermissions.Current.ShouldShowRequestPermissionRationaleAsync(Plugin.Permissions.Abstractions.Permission.LocationWhenInUse))
                {
                    await
                        DisplayAlert("Need your location", "We need to acces your location", "Ok");
                }

                var result = await CrossPermissions.Current.RequestPermissionsAsync(Plugin.Permissions.Abstractions.Permission.LocationWhenInUse);

                if (result.ContainsKey(Plugin.Permissions.Abstractions.Permission.LocationWhenInUse))
                    status = result[Plugin.Permissions.Abstractions.Permission.LocationWhenInUse];
            }

            if (status == Plugin.Permissions.Abstractions.PermissionStatus.Granted)
                this.LocationMap.IsShowingUser = true;
            else
                await
                    DisplayAlert("Need your location", "We need to acces your location", "Ok");

        }
        catch (Exception exception)
        {
            await
                DisplayAlert("Error", exception.Message, "Ok");
        }
}

Visual Studio 告诉我

CrossPermissions.Current.ShouldShowRequestPermissionRationaleAsync(Plugin.Permissions.Abstractions.Permission.LocationWhenInUse)) 已过时,新方法为:

CrossPermissions.Current.ShouldShowRequestPermissionRationaleAsync()

但是,如果我使用新方法

var result = await CrossPermissions.Current.RequestPermissionsAsync(Plugin.Permissions.Abstractions.Permission.LocationWhenInUse);

if (result.ContainsKey(Plugin.Permissions.Abstractions.Permission.LocationWhenInUse))
    status = result[Plugin.Permissions.Abstractions.Permission.LocationWhenInUse];

结果没有.ContainsKey 方法。

我该如何解决这个问题?

对不起,我的英语不好,谢谢

【问题讨论】:

标签: c# xml google-maps xamarin xamarin.android


【解决方案1】:
    public async void GetPermission()
    {
        var permission = await Permissions.CheckStatusAsync<Permissions.LocationWhenInUse>();

        if (permission != PermissionStatus.Granted)
        {
            permission = await Permissions.RequestAsync<Permissions.LocationWhenInUse>();
        }
        else if(permission == PermissionStatus.Granted)
            this.LocationMap.IsShowingUser = true;

        if (permission != PermissionStatus.Granted)
            return;
    }

我用这个方法解决了,谢谢大家的回答

【讨论】:

    【解决方案2】:

    您可以像这样使用 Xamarin.Essential 和 Dependency 服务获取权限:

    界面

    public interface IPermissionHelper
    {  
       Task<PermissionStatus> RequestPermissionsAsync();
    }
    

    从共享项目中调用它:

    await DependencyService.Get<IPermissionHelper>().RequestPermissionsAsync();
    

    iOS 渲染器:

    public class PermissionHelper : IPermissionHelper
    {
        public PermissionHelper()
        {
        }
    
        /// <summary>
        /// Defines the showTrackingMap.
        /// </summary>
        LocationCheck showTrackingMap;
    
        /// <summary>
        /// The RequestPermissionsAsync.
        /// </summary>
        /// /// <returns>The <see cref="Task<PermissionStatus>"/>.</returns>
        public async Task<PermissionStatus> RequestPermissionsAsync()
        {
            PermissionStatus permission = PermissionStatus.Unknown;
            showTrackingMap = new LocationCheck((s, ev) => {
                if ((ev as LocationCheck.LocationCheckEventArgs).Allowed)
                {
                    permission = PermissionStatus.Granted;
                }
                else
                {
                    permission = PermissionStatus.Denied;
                }
                showTrackingMap.Dispose();
            });
    
            while (permission == PermissionStatus.Unknown)
            {
                await Task.Delay(10);
            }
    
            return permission;
        }
    }
    
    public class LocationCheck : NSObject, ICLLocationManagerDelegate
    {
        public class LocationCheckEventArgs : EventArgs
        {
            public readonly bool Allowed;
            public LocationCheckEventArgs(bool Allowed)
            {
                this.Allowed = Allowed;
            }
        }
    
        CLLocationManager locationManager;
        EventHandler locationStatus;
    
        public LocationCheck(EventHandler locationStatus)
        {
            this.locationStatus = locationStatus;
            Initialize();
        }
    
        public LocationCheck(NSObjectFlag x) : base(x) { Initialize(); }
    
        public LocationCheck(IntPtr handle) : base(handle) { Initialize(); }
    
        public LocationCheck(IntPtr handle, bool alloced) : base(handle, alloced) { Initialize(); }
    
        public void Initialize()
        {
            locationManager = new CLLocationManager
            {
                Delegate = this
            };
            locationManager.RequestWhenInUseAuthorization();
        }
    
        [Export("locationManager:didChangeAuthorizationStatus:")]
        public void AuthorizationChanged(CLLocationManager manager, CLAuthorizationStatus status)
        {
            switch (status)
            {
                case CLAuthorizationStatus.AuthorizedAlways:
                case CLAuthorizationStatus.AuthorizedWhenInUse:
                    locationStatus.Invoke(locationManager, new LocationCheckEventArgs(true));
                    break;
                case CLAuthorizationStatus.Denied:
                case CLAuthorizationStatus.Restricted:
                    locationStatus.Invoke(locationManager, new LocationCheckEventArgs(false));
                    break;
            }
        }
    
        protected override void Dispose(bool disposing)
        {
            locationStatus = null;
            locationManager.Delegate = null;
            locationManager.Dispose();
            base.Dispose(disposing);
        }
    }
    

    【讨论】:

    • 感谢您回答这个问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 2018-01-11
    相关资源
    最近更新 更多