如何在 Xamarin Forms 中检查位置服务是否为 "on"?

How to check if the location service is "on" in Xamarin Forms?

我的应用程序支持位置信息。所以我需要开启定位服务。我在 iOS platform 上看到过关于检查位置服务状态的问题,但是有没有办法在共享项目中检查这个?

我正在寻找一种事件类型的解决方案,如果用户关闭定位服务,该应用程序将停止其正在执行的操作并要求用户再次打开该定位服务。

您可以使用 DependencyService 查看该位置是否已打开。

这是我的 cs 代码:

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 上执行此操作,所以我将引导您完成它。

首先,我们是否应该在共享代码的服务文件夹中创建一个接口,其中包含:

public interface IGpsDependencyService
{ 
        bool IsGpsTurnedOn();
        void OpenSettings();
}

这里有两个函数:

  • IsGpsTurnedOn(): 检查 GPS 是否开启
  • OpenSettings():打开位置设置页面供用户开启GPS功能。

现在我们需要制作这两个函数背后的本机代码:

在我们的 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.ActionLocat‌​ionSourceSettings);
            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();
            }
        }
    }
}

现在,我们所要做的就是在我们可爱的代码中调用这两个函数!

  • 使用 IsGpsTurnedOn(): DependencyService.Get().IsGpsTurnedOn();
  • 使用 OpenSettings(): DependencyService.Get().OpenSettings();

希望对你有帮助,欢迎在评论中提问


来源: https://github.com/xamarin/Essentials/issues/1257#issuecomment-623029612