【问题标题】:IsProviderEnabled always return true either Location service is enabled or disabledIsProviderEnabled 始终返回 true 启用或禁用位置服务
【发布时间】:2016-08-19 10:41:41
【问题描述】:

我正在使用 xamarin 表单。我需要检查是否为 android 启用了位置服务。我写了以下代码:

   LocationManager locMgr = GetSystemService(LocationService) as LocationManager;
   string Provider = LocationManager.GpsProvider;
   var islocationEnabled = locMgr.IsProviderEnabled(Provider);

但无论是否启用定位服务,我总能获得真正的价值。我怎样才能得到正确的值?

【问题讨论】:

  • 你用的是模拟器还是真机?
  • 我在模拟器和真机上都进行了测试。但是得到同样的结果

标签: android xamarin.forms locationmanager location-provider


【解决方案1】:

如果您使用的是 Plugin.Geolocator.CrossGeolocator,请注意:

IsGeolocationEnabledIsGeolocationAvailable 仅在允许位置的应用权限后才返回正确的信息!!!!!!

如果您想知道在您允许位置应用权限之前是否在移动设备上启用了位置服务,您必须这样做:

安卓

  public bool IsLocationGpsEnabled()
    {
        var _locationManager = (LocationManager)Forms.Context.GetSystemService(Context.LocationService);
        if (_locationManager.IsProviderEnabled("gps"))
        {
            return true;
        }

        return false;
    }

iOS

 public bool IsLocationGpsEnabled()
    {
        return CLLocationManager.LocationServicesEnabled;
    }

【讨论】:

    【解决方案2】:

    如果您在 Xamarin.Forms 中工作,为什么不使用 nuget 包 Xam.Plugin.Geolocator?我正在使用它,并将我的位置代码放在我的 PCL 中,因此它是跨平台的并且不会重复。如果您真的只需要 Android 中的位置,您可以使用这个 sn-p 并将其直接放入您的 android 项目中。

    (我通常包装插件,这样可以最大限度地减少它们的影响,因此示例中的包装器类和接口)

    public class LocationService : ILocationService
    {
        readonly ILogger _logger;
        public LocationService(ILogger logger)
        {
            _logger = logger;
        }
    
        public async Task<IPosition> GetPosition()
        {
            var locator = Plugin.Geolocator.CrossGeolocator.Current;
    
            //1609 meters in a mile. Half a mile accuracy should be good 
            //since we are rounding to whole numbers
            locator.DesiredAccuracy = 800;
    
            try
            {
                var position = await locator.GetPositionAsync(5000);
    
                return position.ToPosition();
            }
            catch (Exception ex)
            {
                _logger.Log(ex);
                return null;
            }
        }
    }
    

    如果需要,这可以全部压缩为一行:

    return await Plugin.Geolocator.CrossGeolocator.Current.GetPositionAsync();
    

    编辑: 该插件还具有确定地理定位状态的方法,例如IsGeolocationEnabledIsGeolocationAvailable。 由于是开源的,可以查看implementation on Android

    【讨论】:

    • 但我需要知道定位服务是否启用。在这里,您获取的设备位置与位置服务是否启用无关。
    • @an它是一个开源项目,所以你可以看到实现。如果您只是去检查一下,它就有您正在寻找的方法。我用确切的链接更新了帖子。
    • 感谢更新,我试过了,但在这两种情况下,无论是否启用了定位服务,我仍然是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多