如何检查Xamarin表单中的network_provider和gps_provider?

时间:2018-11-12 20:10:33

标签: android xamarin xamarin.forms gps geofencing

我正在使用Xamarin.Forms并正在运行将在Android和Iphone中运行的项目。我的项目结构(如果该信息有用吗?)是同一解决方案中的三个项目“ MyApp”,“ MyApp.Android”和“ MyApp.iOS”。

现在,为了使用地理栅栏,我正在使用不同的插件,例如Xam.Plugin.Geolocator和Plugin.Geofencing.Eddy,但是我遇到了一些问题(如在其他问题Geofence for xamarin crossplatform中所述)。 / p>

现在,我想检查地理围栏是否能够工作,检查GPS_PROVIDER和NETWORK_PROVIDER是否可用,如何实现?现在,我只能检查是否启用了位置,而不能检查哪个提供商。

public bool IsLocationAvailable()
            {
                if (!CrossGeolocator.IsSupported)
                    return false;
                if (!CrossGeolocator.Current.IsGeolocationEnabled)
                    return false;
                if (!CrossGeolocator.Current.IsGeolocationAvailable)
                    return false;
                if (!CrossGeofencing.IsSupported)
                    return false;
                return true;
            }

现在,如果将位置提供程序设置为“仅GPS”,则会因此引发错误,但是我不确定如何捕获并处理它。我看到了其他一些示例和问题,但仅适用于android,如果我已经在使用这些插件,并且主要在xamarin表单项目(又名“ MyApp”)而不是android的项目上工作,我不确定如何实现这些问题。 MyApp.Android”)

对不起,我不确定如何调整大小!

1 个答案:

答案 0 :(得分:1)

您始终可以使用Xamarin.Forms Dependency Service在共享项目“ MyApp”中运行平台特定的代码。

基本思想是,您在共享项目中创建一个接口,将其称为IGetLocationProvider:

public interface IGetLocationProvider {
    string GetProvider (); 
}

然后在Android“ MyApp.Android”和/或iOS“ MyApp.iOS”应用程序项目中,在类中实现接口,并将Dependency属性添加到该类。但是首先,您需要访问Android应用程序上下文。在Android应用程序项目中全局可用的最简单方法是向MainActivity类添加静态变量,然后在OnCreate中进行设置:

public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
    public static Context Context;
    ... 
    protected override void OnCreate(Bundle savedInstanceState)
    {
        ...
        MainActivity.Context = this;

    }
}

现在这是针对Android的特定于平台的Dependency Service,它将返回一个用逗号分隔的可用位置提供程序的字符串:

using System;
using GetLP.Droid;
using Xamarin.Forms;
using Android.Locations;

[assembly: Dependency(typeof(GetLocationProvider))]
namespace GetLP.Droid
{
    public class GetLocationProvider : IGetLocationProvider
    {
        public string GetProvider()
        {
            string returnString = "";

            LocationManager manager = (LocationManager)MainActivity.Context.GetSystemService(Android.Content.Context.LocationService);
            bool gpsProviderEnabled = manager.IsProviderEnabled(LocationManager.GpsProvider);
            bool networkProviderEnabled = manager.IsProviderEnabled(LocationManager.NetworkProvider);
            bool passiveProviderEnabled = manager.IsProviderEnabled(LocationManager.PassiveProvider);

            returnString += gpsProviderEnabled ? "GPS," : ",";
            returnString += networkProviderEnabled ? "Network," : ",";
            returnString += passiveProviderEnabled ? "Passive" : "";

            return returnString;
        }
    }
}

现在,您可以从共享代码中调用GetProvider:

string providers = DependencyService.Get<IGetLocationProvider>().GetProvider();

变量providers将是可用提供者的逗号分隔字符串,例如如果GSP和Passive可用,则字符串为“ GPS ,, Passive”;如果Network和Passive可用,则字符串为“,Network,Passive”。当然,您可以更改GetProvider以返回数组或List或任何您想要的东西,只需确保它在所有平台上都可用,即不要返回LocationManager,因为这是Android特定类型。

对于iOS,没有相似之处。 iOS决定获取位置时使用哪种方法获取位置以及OS使用的操作系统对应用程序开发人员不可用,因此您只想在Android上运行时调用此依赖项服务。