Как я могу получить постоянную геолинацию от Xamarin.Forms? - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь получить местоположение моего устройства постоянно, используя Xamarin Essentials, но его поведение довольно странное. Сигнал GPS активируется и отключается каждый раз, когда я использую метод GetLocationAsync (это похоже на мигающий режим).

Это мой код:

Основной поток:

Xamarin.Forms.Device.StartTimer(TimeSpan.FromMilliseconds(gpsFrequencyRead, () =>
        {
            Xamarin.Forms.Device.BeginInvokeOnMainThread(async () =>
            {
                if (!isBusy)
                {
                    isBusy = true;
                    await MainMethodProcess();
                    isBusy = false;
                }
            });

            return activeMainTimer;

        });

MainMethodProcess:

...

Location location = new Location();

location = await Geolocation.GetLocationAsync(request);

...

Если я сравниваю это поведение с другим приложением, использующим местоположение GPS, просто активируйте сигнал GPS один раз и не больше. Что я делаю не так?

Вот такие результаты:

Searching GPS

Active module

1 Ответ

0 голосов
/ 21 октября 2019

Насколько я знаю, Xamarin.Essentials не имеет прослушивателя местоположения для обнаружения изменений местоположения в фоновом режиме. Решением было бы использование плагина Geolocator от jamesmontemagno.

Вот пример того, как его использовать ( source )

async Task StartListening()
{
    await CrossGeolocator.Current.StartListeningAsync(TimeSpan.FromSeconds(5), 10, true, new Plugin.Geolocator.Abstractions.ListenerSettings
    {
        ActivityType = 
        Plugin.Geolocator.Abstractions.ActivityType.AutomotiveNavigation,
        AllowBackgroundUpdates = true,
        DeferLocationUpdates = true,
        DeferralDistanceMeters = 1,
        DeferralTime = TimeSpan.FromSeconds(1),
        ListenForSignificantChanges = true,
        PauseLocationUpdatesAutomatically = false
    });
    CrossGeolocator.Current.PositionChanged += Current_PositionChanged;
}

private void Current_PositionChanged(object sender, Plugin.Geolocator.Abstractions.PositionEventArgs e)
{
    Device.BeginInvokeOnMainThread(() =>
    {
        var Position = e.Position;
    });
} 
...