如何以Xamarin表格获取设备的GPS位置?

时间:2018-08-16 00:58:49

标签: android xamarin xamarin.forms geolocation xamarin.essentials

entLocation 输入框被聚焦时,我想获取设备的经度和纬度。我正在使用 Xamarin.Essential Geolocation 来获取设备的GPS位置,但仍遵循文档和教程,但仍然无法获取GPS位置。我在我的android清单中添加了以下权限,仍然没有。我收到有关“ Error3” 的显示警报,当无法获取位置时, Error3 是一个例外。

  

错误为“ Java.Lang.NullPointerException:尝试在空对象引用上调用虚拟方法'void android.app.Activity.requestPermissions(java.lang.String [],int)'



我的问题:
1.我的代码有什么错误?
2.我可以使我的GPS位置离线吗?如果可以,我该如何实现?

  

uses-permission android:name =“ android.permission.ACCESS_COARSE_LOCATION”
  使用权限android:name =“ android.permission.ACCESS_FINE_LOCATION”
  Uses-feature android:name =“ android.hardware.location” android:required =“ false”
  Uses-feature 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 个答案:

答案 0 :(得分: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或更高版本,您需要具有运行时权限。为此,您需要在OnStart()中覆盖MainActivity.cs方法。我引用了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将显示异常。从设备上的“允许访问位置?” 提示中选择“允许” 后,再次运行该项目时不会出现异常。我尚未处理此问题。

我的极限

正如我所说,这个问题尚未完全解决。我的答案是帮助您暂时解决位置权限问题并继续前进。而且我不知道如何离线获取位置信息。