【问题标题】:Android Xamarin C#: Get the number of satellites used for GPS locationAndroid Xamarin C#:获取用于 GPS 定位的卫星数量
【发布时间】:2016-04-11 01:35:58
【问题描述】:

我想找到我的 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,然后尝试获取卫星编号。

【问题讨论】:

    标签: c# android xamarin gps satellite


    【解决方案1】:

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

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

    【讨论】:

    • 嘿,谢谢你的回答,我试图在我的代码中实现你的答案,但它仍然返回为 0,在 sat.HasNext 行它总是说迭代器没有下一个并跳过 while块。
    • 我不确定使用geo fix 的具体细节,正如我提到的,我只在物理设备上进行了测试。这里有关于模拟数据的更多文档:developer.android.com/guide/topics/location/… 否则,您可以尝试通过位置 GUI 来查看您的模拟器是否提供了这种类型的功能(新的 Android SDK 工具 25.1+ 内置了此功能)-android-developers.blogspot.com/2016/04/android-studio-2-0.html 我会个人建议您购买 Android 设备来测试位置/地图/等,因为它更容易。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 2016-11-17
    • 1970-01-01
    相关资源
    最近更新 更多