Xamarin.Forms - Plugin.Geolocator(获取地理位置)

之前公司的一个项目是有关物流的,有这么一个需求,需要定位当前车辆的位置,获取定位点并最终在地图上根据定位点画出行驶轨迹。一开始的第一反应,“头疼,肯定要分平台实现了”,毕竟定位这个功能对应各个平台的实现还是有一定差异性的,最后发现有这么一个插件Xam.Plugin.Geolocator可以直接在Xamarin.Forms中实现,下面就来看看具体的实现步骤,

1.插件引用

在项目中引入Xam.Plugin.Geolocator的插件,这里和上篇Xam.Plugin.Media的引用注意事项是一样的,这里就一句带过了。

2.权限配置

移动端有关设备相关功能的开发,做多了会发现,其实前期步骤都是差不多的,那就是配置好相应的权限,这是很简单的一步,同时也是最容易被忽略的一步,有的时候发现程序报错,功能无法实现,抓耳挠腮后才发现“MMP!忘开权限了!”。特别是IOS相关的一些权限配置,这个我打算在下一篇单拎一章来和大家分享一下。

2.1 Android

由于此插件使用Current Activity Plugin来访问当前的Android Activity,所以需要在 OnCreate方法中添加Current Activity 插件的初始化设置,代码如下:

  1. MainActivity.cs

    	  CrossCurrentActivity.Current.Init(this, bundle);
    

    紧接着在MainActivity中添加Permissions Plugin 权限请求设置,代码如下:

    	public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Android.Content.PM.Permission[] grantResults)
    	{
    	    Plugin.Permissions.PermissionsImplementation.Current.OnRequestPermissionsResult(requestCode, permissions, grantResults);
    	}
    
  2. AndroidManifest.xml
    配置请求权限(亦可手动勾选配置)

    	<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    	<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    
  3. AssembleInfo.cs
    在我们添加了上述的权限后,Google Play会自动过滤掉没有特定硬件的设备,为了防止出现这种情况,我们需要告诉Google当前设备在没有以下硬件功能时也可以正常工作,代码如下:

    [assembly: UsesFeature("android.hardware.location", Required = false)]
    [assembly: UsesFeature("android.hardware.location.gps", Required = false)]
    [assembly: UsesFeature("android.hardware.location.network", Required = false)]
    

2.2 IOS

在你调用定位功能的时候,需要询问使用者,是否允许开启地理位置访问,这个时候就需要在Info.plist中添加如图几个权限:
在这里插入图片描述
对于定位功能的使用,有的时候只需要单独获取一次定位点即可,而有的时候则需要定时获取当前的定位,这个时候就需要应用在后台常驻,此时需要开通如图权限:
在这里插入图片描述
设定好权限后,手机的设置中找到对应的App可以看到位置权限有以下选项:
在这里插入图片描述

3.代码实现

3.1获取当前位置

   public static async Task<Position> GetCurrentPosition()
	{
			Position position = null;
			try
			{
					var locator = CrossGeolocator.Current;
					locator.DesiredAccuracy = 100;

					position = await locator.GetLastKnownLocationAsync();

					if (position != null)
					{
							return position;
					}

					if (!locator.IsGeolocationAvailable || !locator.IsGeolocationEnabled)
					{
							return null;
					}

					position = await locator.GetPositionAsync(TimeSpan.FromSeconds(20), null, true);

			}
			catch (Exception ex)
			{
					Debug.WriteLine("无法获取地里位置: " + ex);
			}

			if (position == null)
					return null;

			var output = string.Format("Time: {0} \nLat: {1} \nLong: {2} \nAltitude: {3} \nAltitude Accuracy: {4} \nAccuracy: {5} \nHeading: {6} \nSpeed: {7}",
					position.Timestamp, position.Latitude, position.Longitude,
					position.Altitude, position.AltitudeAccuracy, position.Accuracy, position.Heading, position.Speed);

			Debug.WriteLine(output);

			return position;
	}

3.1监听位置变化

async Task StartListening()
{
	if(CrossGeolocator.Current.IsListening)
		return;
	
  await CrossGeolocator.Current.StartListeningAsync(TimeSpan.FromSeconds(5), 10, true);

  CrossGeolocator.Current.PositionChanged += PositionChanged;
  CrossGeolocator.Current.PositionError += PositionError;
}

private void PositionChanged(object sender, PositionEventArgs e)
{
  var position = e.Position;
  var output = "Full: Lat: " + position.Latitude + " Long: " + position.Longitude;
  output += "\n" + $"Time: {position.Timestamp}";
  output += "\n" + $"Heading: {position.Heading}";
  output += "\n" + $"Speed: {position.Speed}";
  output += "\n" + $"Accuracy: {position.Accuracy}";
  output += "\n" + $"Altitude: {position.Altitude}";
  output += "\n" + $"Altitude Accuracy: {position.AltitudeAccuracy}";
  Debug.WriteLine(output);
} 

private void PositionError(object sender, PositionErrorEventArgs e)
{
  Debug.WriteLine(e.Error);
} 

async Task StopListening()
{
	if(!CrossGeolocator.Current.IsListening)
		return;
	
  await CrossGeolocator.Current.StopListening);

  CrossGeolocator.Current.PositionChanged -= PositionChanged;
  CrossGeolocator.Current.PositionError -= PositionError;
}

4.总结

用Xamarin开发定位并没有想象中的复杂,有现成的插件可以直接使用,像上一篇中“媒体设备的使用”和“定位“实现起来的方法与开发的流程几乎是一致的,但是其中的细节还是很多的,可能因为博主本身并不是做移动端开发的,在两个平台当中遗漏了很多细节,这些会在下一篇文章中做详细整理。
传送门

源码

源码地址
GitHub:https://github.com/jamesmontemagno/GeolocatorPlugin

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值