如何在 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 中获取设备音量

Xamarin.Forms如何获取当前登录用户的Id等信息?

如何使用 xamarin.forms 在移动设备中选择多个音频和/或视频文件?

Xamarin Forms - 每 10 秒获取一次设备位置(当应用程序在前台/后台运行时)

如何在 Xamarin.Forms 中获取/检测屏幕大小?

如何在 xamarin.forms 中获取状态栏高度?