Android Xamarin C#: получение количества спутников, используемых для определения местоположения GPS

Я хочу найти количество спутников, которые использует мой GPS, но что бы я ни делал, он всегда возвращает 0. Я гуглил и много читал о людях с такой же или похожей проблемой, но ни одно из исправлений мне не помогло. Он все равно вернет только 0.

Вот моя функция:

    private static int TotalSatillites(Android.Locations.LocationManager locationProviders)
    {
        var gpsStatus = locationProviders.GetGpsStatus(null);
        var satilliteIterator = gpsStatus.Satellites.Iterator();

        var totalSatillies = 0;
        while (satilliteIterator.HasNext)
        {
            var satillite = (GpsSatellite)satilliteIterator.Next();
            if (satillite.UsedInFix())
            {
                totalSatillies++;
            }
        }

        return totalSatillies;
    }

AFAIK Это должно работать, но не работает, и я не могу понять, почему. Я также пробовал использовать локации Extras, например:

var sats = location.Extras.GetInt("satellites");

Но это также всегда возвращается только 0.

Примечание. Я тестирую это полностью в эмуляторе Android и устанавливаю местоположение через telnet с помощью команды:

geo fix 9 9 9 9

Который должен установить широту и долготу на 9, высоту на 9 и спутники на 9. Это (должно быть?) Работает, поскольку мой код сначала получает 9 для долготы и альта, а затем пытается получить номера спутников.


person wootank    schedule 11.04.2016    source источник


Ответы (1)


Я считаю, что короткий ответ на этот вопрос заключается в том, чтобы вы использовали LocationManager.RequestLocationUpdates с minTime = 0 и minDistance = 0, поэтому он быстро запускает событие OnGpsStatusChanged. Вот простое приложение, которое должно продемонстрировать, что я имею в виду:

using System;
using Android.App;
using Android.Content;
using Android.Locations;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using Java.Lang;
using Java.Util;
using Debug = System.Diagnostics.Debug;

namespace App24_Droid
{
    [Activity(Label = "App24_Droid", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity, GpsStatus.IListener, ILocationListener
    {
        int count = 1;
        private LocationManager locationManager = null;

        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);

            // Get our button from the layout resource,
            // and attach an event to it
            Button button = FindViewById<Button>(Resource.Id.MyButton);

            locationManager = (LocationManager) GetSystemService(Context.LocationService);
            locationManager.AddGpsStatusListener(this);
            locationManager.RequestLocationUpdates(LocationManager.GpsProvider, 0, 0, this);

            GpsStatus gpsStatus = locationManager.GetGpsStatus(null);
            if (gpsStatus != null)
            {
                IIterable satellites = gpsStatus.Satellites;
                IIterator sat = satellites.Iterator();
                string lSatellites = null;
                int i = 0;
                while (sat.HasNext)
                {
                    GpsSatellite satellite = sat.Next().JavaCast<GpsSatellite>();
                    Debug.WriteLine(satellite.Prn);
                }
            }


            button.Click += delegate
            {
                button.Text = string.Format("{0} clicks!", count++);

            };
        }

        public void OnGpsStatusChanged(GpsEvent e)
        {
            GpsStatus gpsStatus = locationManager.GetGpsStatus(null);
            if (gpsStatus != null)
            {
                IIterable satellites = gpsStatus.Satellites;
                IIterator sat = satellites.Iterator();
                string lSatellites = null;
                int i = 0;
                while (sat.HasNext)
                {
                    GpsSatellite satellite = sat.Next().JavaCast<GpsSatellite>();
                    Debug.WriteLine(satellite.Prn);
                }
            }
        }

        public void OnLocationChanged(Location location)
        {

        }

        public void OnProviderDisabled(string provider)
        {

        }

        public void OnProviderEnabled(string provider)
        {

        }

        public void OnStatusChanged(string provider, Availability status, Bundle extras)
        {

        }
    }
}

Обратите внимание, что я проверил это на физическом устройстве, просто отключив Wi-Fi и убедившись, что мои службы определения местоположения включены.

person Jon Douglas    schedule 11.04.2016
comment
Привет, спасибо за ответ, я попытался внедрить ваш ответ в свой код, но он все равно возвращается как 0, в строке sat.HasNext всегда будет говориться, что у итератора нет следующего, и пропускается блок while. - person wootank; 11.04.2016
comment
Я не уверен в особенностях использования geo fix, поскольку я уже упоминал, что проверял это только на физическом устройстве. Дополнительная документация по фиктивным данным приведена здесь: developer.android.com/guide. /topics/location/ В противном случае вы можете попробовать посмотреть, предоставляет ли ваш эмулятор такие функции через графический интерфейс местоположения (в новых инструментах Android SDK 25.1+ эта функция встроена) — android-developers.blogspot.com/2016/04/android-studio-2-0. html Я бы лично рекомендовал вам инвестировать в устройство Android для тестирования местоположения/карт/и т. д., так как это проще. - person Jon Douglas; 11.04.2016