1

当名为entLocation的输入框处于焦点时,我想获取设备的经度和纬度。我正在使用Xamarin.Essential Geolocation获取设备的 GPS 位置,我按照文档和教程进行操作,但仍然无法获取 GPS 位置。我已经在我的 android 清单下面添加了权限,但仍然没有。我在“Error3”上收到显示警报,Error3是Unable to get location时的异常。

错误是“ 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"
使用-feature android:name="android.hardware.location.gps" android:required="false"
使用-feature 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");
        }
    }
4

1 回答 1

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. 我使用 Xamarin.Forms.Maps 引用了 Android 6.0 以上的位置权限。这是我所做的

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 会显示异常。从“允许访问位置?”中选择“允许”后 在设备上提示,再次运行项目时不会出现异常。我还没有处理这个问题。

我的极限

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

于 2018-08-16T05:02:57.597 回答