0

我想找到我的 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 这应该有效,但似乎不起作用,我不知道为什么。我也尝试过使用额外的位置,如下所示:

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

但这也只会返回 0。

注意:我完全在 android 模拟器中对此进行测试,并通过 telnet 使用以下命令设置位置:

geo fix 9 9 9 9

哪个应该将 lat 和 long 设置为 9,将高度设置为 9,将卫星设置为 9。这(应该是?)工作,因为我的代码首先获取 9 的 lat long 和 alt,然后尝试获取卫星编号。

4

1 回答 1

1

我相信这个问题的简短答案是让您使用LocationManager.RequestLocationUpdatesa minTime= 0 和 a 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)
        {

        }
    }
}

请注意,我在物理设备上对此进行了测试,只需关闭我的 wifi 并确保我的位置服务已打开。

于 2016-04-11T02:51:51.200 回答