我的应用程序需要使用位置信息,因此需要开启位置服务。我看到了一些有关在iOS平台检查位置服务状态的问题,但是否有一种方法可以在共享项目中检查这一点?
我正在寻找一种事件类型的解决方案,如果用户关闭位置服务,则应用程序将停止当前操作并要求用户重新开启位置服务。
private void Button_Clicked(object sender, EventArgs e)
{
var check = DependencyService.Get<IDeviceOrientationService>().IsLocationServiceEnabled();
if (check)
{
res.Text = "It is on";
}
else
{
res.Text = "It is off";
}
}
以下是我方法的实现代码(在App.Android中):
[assembly: Dependency(typeof(DeviceOrientationService))]
namespace App13.Droid
{
class DeviceOrientationService : IDeviceOrientationService
{
public bool IsLocationServiceEnabled()
{
LocationManager locationManager = (LocationManager)Android.App.Application.Context.GetSystemService(Context.LocationService);
return locationManager.IsProviderEnabled(LocationManager.GpsProvider);
}
}
}
您可以使用DependancyService来查看位置是否已打开。有些人阅读此问题可能会想知道如何在iOS上执行此操作,因此我将为您介绍。
首先,我们应该在共享代码的Service文件夹中创建一个接口,其中包含:
public interface IGpsDependencyService
{
bool IsGpsTurnedOn();
void OpenSettings();
}
这里有两个函数:
在Service文件夹中为我们的iOS和Android项目创建GpsDependancyService.cs文件
在iOS中,我们可以编写如下代码:
[assembly: Xamarin.Forms.Dependency(typeof(GpsDependencyService))]
namespace YourApp.iOS.Services
{
public class GpsDependencyService : IGpsDependencyService
{
public bool IsGpsTurnedOn()
{
if (CLLocationManager.Status == CLAuthorizationStatus.Denied)
{
return false;
}
else
{
return true;
}
}
public void OpenSettings()
{
var WiFiURL = new NSUrl("prefs:root=WIFI");
if (UIApplication.SharedApplication.CanOpenUrl(WiFiURL))
{ //> Pre iOS 10
UIApplication.SharedApplication.OpenUrl(WiFiURL);
}
else
{ //> iOS 10
UIApplication.SharedApplication.OpenUrl(new NSUrl("App-Prefs:root=WIFI"));
}
}
}
}
然后,对于Android,我们可以编写:
[assembly: Xamarin.Forms.Dependency(typeof(GpsDependencyService))]
namespace YourApp.Droid.Services
{
public class GpsDependencyService : IGpsDependencyService
{
public bool IsGpsTurnedOn()
{
LocationManager locationManager = (LocationManager)Android.App.Application.Context.GetSystemService(Context.LocationService);
return locationManager.IsProviderEnabled(LocationManager.GpsProvider);
}
public void OpenSettings()
{
Intent intent = new Intent(Android.Provider.Settings.ActionLocationSourceSettings);
intent.SetFlags(ActivityFlags.ClearTop | ActivityFlags.NewTask);
try
{
Android.App.Application.Context.StartActivity(intent);
}
catch (ActivityNotFoundException activityNotFoundException)
{
System.Diagnostics.Debug.WriteLine(activityNotFoundException.Message);
Android.Widget.Toast.MakeText(Android.App.Application.Context, "Error: Gps Activity", Android.Widget.ToastLength.Short).Show();
}
}
}
}
希望这能有所帮助,如果您有任何问题,请在评论区提问。
来源:https://github.com/xamarin/Essentials/issues/1257#issuecomment-623029612