Android Xamarin C#:获取用于 GPS 定位的卫星数量
Android Xamarin C#: Get the number of satellites used for GPS location
我想知道我的 GPS 正在使用的卫星数量,但无论我做什么,它总是 returns 0。
我用谷歌搜索并阅读了很多关于有相同或相似问题的人的信息,但 none 的修复似乎对我有用。它仍然只有 return 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;
}
据我所知,这应该有效,但似乎无效,我也不知道为什么。
我也试过像这样使用额外的位置:
var sats = location.Extras.GetInt("satellites");
但这也只会返回 0。
注意:我正在 android 模拟器中完全测试它,我正在使用以下命令通过 telnet 设置位置:
geo fix 9 9 9 9
应该将纬度和经度设置为 9,将高度设置为 9,将卫星设置为 9。这(应该是?)在我的代码中工作,首先获取经纬度和 alt 的 9,然后尝试获取卫星编号。
我相信这个问题的简短答案是让你使用 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)
{
}
}
}
请注意,我只是在物理设备上测试了此功能,只需关闭我的 wifi 并确保我的定位服务已开启。
我想知道我的 GPS 正在使用的卫星数量,但无论我做什么,它总是 returns 0。 我用谷歌搜索并阅读了很多关于有相同或相似问题的人的信息,但 none 的修复似乎对我有用。它仍然只有 return 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;
}
据我所知,这应该有效,但似乎无效,我也不知道为什么。 我也试过像这样使用额外的位置:
var sats = location.Extras.GetInt("satellites");
但这也只会返回 0。
注意:我正在 android 模拟器中完全测试它,我正在使用以下命令通过 telnet 设置位置:
geo fix 9 9 9 9
应该将纬度和经度设置为 9,将高度设置为 9,将卫星设置为 9。这(应该是?)在我的代码中工作,首先获取经纬度和 alt 的 9,然后尝试获取卫星编号。
我相信这个问题的简短答案是让你使用 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)
{
}
}
}
请注意,我只是在物理设备上测试了此功能,只需关闭我的 wifi 并确保我的定位服务已开启。