Исключение разрешения Geolocation GetLastKnownLocationAsync () из форм Xamarin - сбой вызова и отсутствие запроса на разрешение - PullRequest
0 голосов
/ 16 февраля 2019

Сбой GetLocationAsync в моем приложении Xamarin.Forms.

Я получил последний пакет nuget Xamarin.Essentials.

Я установил необходимые разрешения в info.plist.

Я Я вызываю это из моей ViewModel.

Вызов очень прост:

var location = await Geolocation.GetLastKnownLocationAsync();

, но он не работает И не может запросить пользователядиалоговое окно разрешений, даже если мой info.plist был правильно настроен с помощью: NSLocationWhenInUseUsageDescription Вставить причину

Я спрашиваю и отвечаю на этот вопрос, потому что это был главный вопрос, и я не был точно уверен, что искатьили в чем проблема.

Мои различные поиски указывали на многие связанные проблемы, но ничего, что на самом деле не доходило до основной проблемы.

Самым близким, что я получил, была эта проблема на странице github Essentials: https://github.com/xamarin/Essentials/issues/634

Ответы [ 2 ]

0 голосов
/ 27 июля 2019

Если вы используете Xamarin.Essentials и не запрашиваете разрешения на Android, убедитесь, что вы добавили весь необходимый код в основное действие Android.

См. https://docs.microsoft.com/en-us/xamarin/essentials/get-started?tabs=windows%2Candroid для деталей.

Из документов:

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
    //...

и

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
    Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

    base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
0 голосов
/ 16 февраля 2019

Этот ответ вдохновлен Xamarin / Azure evangelist, Брэндоном Минником -> взгляните на его проект, где он обрабатывает подобную ситуацию со следующим кодом:

Так что можетмы отнимаем от вышесказанного?Если вы посмотрите на контекст, он соединил свои виды с моделями представления в стиле MVVM.Однако различные библиотеки требуют, чтобы определенные методы вызывались из основного потока.В этом суть проблемы, и именно это может решить этот код.

Итак, чтобы принять приведенный выше код для проблемы геолокации, рассмотренной в вопросе, я сделал следующее:

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

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

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

    return locationTaskCompletionSource.Task;
}

Я использую вышеупомянутое из моей 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)
        {
        }
    }
}

Надеюсь, это поможет кому-то еще!

...