隐藏

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

发布:2023/12/7 15:32:52作者:大数据 来源:大数据 浏览次数:534

文章目录
1.插件引用
2.权限配置
2.1 Android
2.2 IOS
3.代码实现
3.1获取当前位置
3.1监听位置变化
4.总结
源码
之前公司的一个项目是有关物流的,有这么一个需求,需要定位当前车辆的位置,获取定位点并最终在地图上根据定位点画出行驶轨迹。一开始的第一反应,“头疼,肯定要分平台实现了”,毕竟定位这个功能对应各个平台的实现还是有一定差异性的,最后发现有这么一个插件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 插件的初始化设置,代码如下:

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);
}

AndroidManifest.xml
配置请求权限(亦可手动勾选配置)

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

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
————————————————
版权声明:本文为CSDN博主「Spy_New_B」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_26584977/article/details/89377734

选取相册图片及拍照:https://blog.csdn.net/qq_26584977/article/details/88942673

声明:本站内容来源于原创和互联网,尊重作者版权,转载请注明来源网址,欢迎收藏,谢谢!