2016-04-11 11 views
0

Ich möchte die Anzahl der Satelliten, die meine GPS verwendet, aber egal was ich es immer 0 zurückgeben. Ich habe gegoogelt und viel über Menschen gelesen mit dem gleichen oder ähnlichen Problem, aber keine der Fixes schien für mich zu funktionieren. Es wäre immer noch zurückkehren nur 0.Android Xamarin C#: Holen Sie sich die Anzahl der Satelliten für GPS-Standort

Hier ist meine Funktion:

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 arbeiten Dies sollte aber offenbar nicht, und ich kann nicht herausfinden, warum. Ich habe auch versucht Standorte Extras wie so verwenden:

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

Aber dies auch nur jemals zurückkommt 0.

Hinweis: ich dies ganz im Android-Emulator mich entschieden, und ich bin den Standort per Telnet Einstellung mit dem Befehl:

geo fix 9 9 9 9 

Welche lat und lange bis 9, Höhe bis 9 und Satelliten bis 9. Diese (sollte?) gesetzt soll arbeiten, wie mein Code, um die 9s für lat lang und alt und dann versucht wird um die Satellitennummern zu bekommen.

Antwort

1

Ich glaube, die kurze Antwort auf diese Frage für Sie LocationManager.RequestLocationUpdates mit einem minTime = 0 und einem minDistance = 0, zu verwenden ist, so dass es feuert schnell eine OnGpsStatusChanged Veranstaltung ab. Hier ist eine einfache Anwendung, die zeigen sollte, was ich meine:

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) 
     { 

     } 
    } 
} 

Bitte beachten Sie, dass ich dies auf einem physischen Gerät durch einfaches Abschalten mein WiFi und gewährleistet meine Ortungsdienste sind auf getestet.

+0

Hey danke für die Antwort, ich habe versucht, deine Antwort in meinen Code zu implementieren, aber es kommt immer noch als 0, auf der Sat.HasNext Zeile wird es immer sagen, der Iterator hat keine nächste und überspringe den While Block. – wootank

+0

Ich bin mir nicht sicher über die Besonderheiten der Verwendung von 'geo fix', da ich erwähnt habe, dass ich dies nur auf einem physischen Gerät getestet habe. Es gibt weitere Dokumentation zu Mock-Daten hier: http://developer.android.com/guide/topics/location/strategies.html#MockData Andernfalls können Sie versuchen zu sehen, ob Ihr Emulator diese Art von Funktionalität über eine Standort-GUI bietet (The new Android SDK-Tools 25.1+ haben diese Funktionalität eingebaut) - http://android-developers.blogspot.com/2016/04/android-studio-2-0.html Ich würde dir persönlich empfehlen, in ein Android-Gerät zu investieren Testen von Orten/Karten/etc, da es einfacher ist. –