我正在使用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”)
对不起,我不确定如何调整大小!
答案 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上运行时调用此依赖项服务。