Xamarin Forms的Geolocation GetLastKnownLocationAsync()权限异常-调用失败且没有权限提示

时间:2019-02-16 02:57:28

标签: xamarin.forms geolocation xamarin.essentials

我的Xamarin.Forms应用程序上的GetLocationAsync失败。

我有最新的Xamarin.Essentials nuget软件包。

我已经在info.plist中设置了必要的权限。

am 从我的ViewModel调用它。

通话非常简单:

var location = await Geolocation.GetLastKnownLocationAsync();

,但这既失败又无法提示用户权限对话框,即使我的info.plist已正确设置为: NSLocationWhenInUseUsesDescription 插入原因

我之所以要回答这个问题,是因为这是一个令人头疼的问题,而且我不确定要搜索的内容还是问题所在。

我的各种搜索都指向许多相关问题,但实际上并没有解决主要问题。

我最接近的实际上是Essentials github页面上的这个问题: https://github.com/xamarin/Essentials/issues/634

2 个答案:

答案 0 :(得分:1)

此答案的灵感来自Xamarin / Azure传播者Brandon Minnick->看看他的项目,他在以下code:

中处理类似的情况

那么,我们可以从以上几点中取什么呢?如果您查看上下文,则他已将其视图与MVVM样式的ViewModels连接起来。但是,各种库要求从Main线程调用某些方法。这是问题的本质,这是此代码可以解决的问题。

因此要针对问题中解决的地理位置问题采用上述代码,我做了以下事情:

Task<Xamarin.Essentials.Location> GetLocationFromPhone()
{

    var locationTaskCompletionSource = new TaskCompletionSource<Xamarin.Essentials.Location>();

    Device.BeginInvokeOnMainThread(async () =>
    {
        locationTaskCompletionSource.SetResult(await Geolocation.GetLastKnownLocationAsync());
    });

    return locationTaskCompletionSource.Task;
}

我正在从TaskModel的ViewModel中使用以上内容。类似于以下内容。

async Task ExecuteGetGeoLocationCommand()
{
    try
    {
        var locationFromPhone = await GetLocationFromPhone().ConfigureAwait(false);

        if (locationFromPhone is null)
            return;

        _location = locationFromPhone;

        if (_location != null)
        {
            Console.WriteLine($"Latitude: {_location.Latitude}, Longitude {_location.Longitude}, Altitude: {_location.Altitude}");
        } 
        else
        {
            Console.WriteLine($"Exiting geolocation");
        }
        catch (FeatureNotSupportedException fnsEx)
        {
        }
        catch (Exception ex)
        {
        }
    }
}

希望对其他人有帮助!

答案 1 :(得分:0)

如果您使用的是Xamarin.Essentials,并且没有提示您获得Android上的权限,请确保已将所有必需的代码添加到Android Main Activity中。

有关详细信息,请参见https://docs.microsoft.com/en-us/xamarin/essentials/get-started?tabs=windows%2Candroid

从文档中

<table style="width:100%">
   <tr>
    <th>Firstname</th>
    <th>Lastname</th> 
    <th>Age</th>
  </tr>
  <tr>
    <td>Jill</td>
    <td>Smith</td> 
    <td>50</td>
  </tr>
  <tr>
    <td>Eve</td>
    <td>Jackson</td> 
    <td>94</td>
  </tr>
</table>

protected override void OnCreate(Bundle savedInstanceState) {
    //...
    base.OnCreate(savedInstanceState);
    Xamarin.Essentials.Platform.Init(this, savedInstanceState); // add this line to your code, it may also be called: bundle
    //...