如何在 Xamarin Forms 中获取设备的 GPS 位置?
Posted
技术标签:
【中文标题】如何在 Xamarin Forms 中获取设备的 GPS 位置?【英文标题】:How can I get GPS Location of my device in Xamarin Forms? 【发布时间】:2019-01-22 21:31:32 【问题描述】:当名为 entLocation 的输入框 focused 时,我想获取设备的经度和纬度。我正在使用 Xamarin.Essential Geolocation 来获取设备的 GPS 位置,我按照文档和教程进行操作,但仍然无法获取 GPS 位置。我已经在我的 android 清单下面添加了权限,但仍然没有。我在 "Error3" 上收到显示警报,Error3 是无法获取位置时的异常。
错误是“Java.Lang.NullPointerException:尝试在空对象引用上调用虚拟方法'void android.app.Activity.requestPermissions(java.lang.String[],int)'"
我的问题: 1. 我的代码有什么错误? 2.我可以离线获取我的gps位置吗?如果是,我该如何实现?
使用权限 android:name="android.permission.ACCESS_COARSE_LOCATION" 使用权限 android:name="android.permission.ACCESS_FINE_LOCATION" 使用功能 android:name="android.hardware.location" android:required="false" 使用功能 android:name="android.hardware.location.gps" android:required="false" 使用功能 android:name="android.hardware.location.network" android:required="false"
private async void entLocation_FocusedAsync(object sender, FocusEventArgs e)
try
var request = new GeolocationRequest(GeolocationAccuracy.Medium);
var location = await Geolocation.GetLocationAsync(request);
if (location != null)
entLocation.Text = location.Longitude.ToString() + "," + location.Latitude.ToString();
catch (FeatureNotSupportedException fnsEx)
await DisplayAlert("Error1", fnsEx.ToString(), "ok");
catch (PermissionException pEx)
await DisplayAlert("Error2", pEx.ToString(), "ok");
catch (Exception ex)
await DisplayAlert("Error3", ex.ToString(), "ok");
【问题讨论】:
【参考方案1】:我还在处理我的第一个需要位置权限的 Xamarin 项目。您应该尝试一些可能有助于获取 GPS 位置的方法。
我的建议
1) 您需要在AndroidManifest
文件中授予额外的权限。这些是
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
2) 由于 Android 6.0 或更高版本,您需要拥有运行时权限。要实现这一点,您需要覆盖 MainActivity.cs
中的 OnStart()
方法。我参考了Location permission for Android above 6.0 with Xamarin.Forms.Maps。这是我所做的
protected override void OnStart()
base.OnStart();
if(CheckSelfPermission(Manifest.Permission.AccessCoarseLocation) != (int)Permission.Granted)
RequestPermissions(new string[] Manifest.Permission.AccessCoarseLocation, Manifest.Permission.AccessFineLocation , 0);
重要提示:我这里的解决方案只是临时处理授予权限。首次构建和运行项目时,Visual Studio 会显示异常。在设备上的“允许访问位置?”提示中选择“允许”后,再次运行项目就不会出现异常了。我还没有处理这个问题。
我的极限
正如我所说,问题并没有完全解决。我的回答是帮助您暂时解决位置权限问题并继续前进。而且我不知道如何离线获取位置信息。
【讨论】:
获取 GPS 位置需要互联网连接吗? 可能。 GPS 也可以通过蜂窝提供商或 wifi 连接来识别。您可以在 [Location Services] (docs.microsoft.com/en-us/xamarin/android/platform/…) 中阅读 location provider 无论有没有互联网连接,它都可以工作。我可以获取我的 GPS 位置 嗨@Fuong,你解决了第一次启动应用程序要求定位权限和崩溃问题吗?以上是关于如何在 Xamarin Forms 中获取设备的 GPS 位置?的主要内容,如果未能解决你的问题,请参考以下文章
Xamarin.Forms如何获取当前登录用户的Id等信息?
如何使用 xamarin.forms 在移动设备中选择多个音频和/或视频文件?