我正在使用xamarin表格。我需要检查Android的位置服务是否启用。我写了以下代码:
LocationManager locMgr = GetSystemService(LocationService) as LocationManager;
string Provider = LocationManager.GpsProvider;
var islocationEnabled = locMgr.IsProviderEnabled(Provider);
但我总是得到真正的价值,无论是否启用了位置服务。我怎样才能得到正确的价值?
答案 0 :(得分:0)
如果您使用的是Plugin.Geolocator.CrossGeolocator,请注意以下事项:
IsGeolocationEnabled 和 IsGeolocationAvailable 仅在允许位置的应用权限后才返回正确的信息!!!!!
如果您想知道在允许位置应用许可之前是否在移动设备上启用了位置服务,您必须这样做:
的Android
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;
}
答案 1 :(得分:-1)
如果您使用的是Xamarin.Forms,为什么不使用nuget包Xam.Plugin.Geolocator?我正在使用它并将我的位置代码放在我的PCL中,因此它是跨平台的,不会重复。如果你真的只需要Android中的位置,你可以把这个片段直接放在你的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();
编辑:
该插件还具有确定地理位置状态的方法,如IsGeolocationEnabled
和IsGeolocationAvailable
。
由于它是开源的,因此您可以查看implementation on Android。