2012-03-26 2 views
4

Ich lese eine Menge Fragen hier aber konnte nicht herausfinden, was das Problem ist.Android Periodic GPS Standortaktualisierungen mit AlarmManager in einem Service

Ich schreibe eine Außendienstanwendung für Android. In einer der Aktivitäten (MyActivity.java) habe ich zwei Schaltflächen: Start und Stop.

Wenn der Außendienstmitarbeiter den Startknopf drückt, muss ich seinen aktuellen Standort mit GPS abrufen und ihn in regelmäßigen Abständen an den Server senden (z. B. 5 Minuten Standard, hier setze ich ihn auf 20 Sekunden zum Testen). Der Kunde will dies sehen, wie lange die Arbeiter Zeit im Verkehr verbringen, der Verkehr in meiner Stadt (Istanbul) ist ein Durcheinander.

Ich habe einen AlarmManager in meiner Aktivität, wenn der Startknopf gedrückt wird, wird der Alarm durch AlarmManager.setRepeating() gesetzt, um den Dienst (ServiceClass.java) zu starten.

Intent intent = new Intent (MyActivity.this, ServiceClass.class); 
mPendingIntent = PendingIntent.getService(MyActivity.this, 0, intent, 
               PendingIntent.FLAG_CANCEL_CURRENT); 
mAlarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
mAlarmManager.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), 20*1000, 
                    mPendingIntent); 

Ich annulliere den Alarm mit der Stop-Taste.

Es funktioniert einwandfrei, bis hier der Service beginnt. Seine onCreate(), onStart() und onDestroy() Methoden werden ausgeführt. Aber ich kann den Ort nicht finden. Ich arbeite nicht an einem echten Gerät, daher verwende ich DDMS, um Standorte zu senden. Aber die Anwendung überspringt diesen Schritt und druckt den Längen- und Breitengrad meiner Position als Lon: 0 Lat: 0.

Hier ist der Code innerhalb des Service:

public void onStart(Intent intent, int startId) { 
    super.onStart(intent, startId); 
    Log.d("Testing", "Service got started, calling location updates:"); 
    mLocationManager.requestSingleUpdate(mCriteria, mLocationListener, 
                   getMainLooper()); 
    Log.i("TESTING LOCATION UPDATE: LOCATION:", "\nLat:" + mLatitude + 
                  " Lon:" + mLongitude); 
    stopSelf(startId); 
    Log.d("Testing", "Service Stopped!"); 

Und schließlich ist hier meine Location:

mLocationListener = new LocationListener() { 
     @Override 
     public void onLocationChanged(Location location) { 

      if(location != null){ 
       mLatitude = location.getLatitude(); 
       mLongitude = location.getLongitude(); 
       Log.i("onLocationChanged(Location location)", "Lat:"+mLatitude + " 
                  Lon:" + mLongitude); 
} 

Auch mein Auge etwas gefangen, wenn ich den Code ausführen:

mLocationProvider = mLocationManager.getBestProvider(mCriteria, true); 
Log.i("BEST PROVIDER IS:", mLocationProvider); 

Es sagt BEST PROVIDER IS: GPS. Aber dieses Protokoll in onProviderEnabled() wird nie in logcat angezeigt.

@Override 
public void onProviderEnabled(String s) { 
    Log.v("onProviderEnabled", "ENABLED"); 
} 

Zwei Dinge hinzuzufügen, wenn ich benutze:

mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, 
                   mLocationListener); 

es funktioniert auch nicht.

Dies ist jedoch funktioniert und ich kann die LastKnownLocation erhalten:

Location lastKnown = mLocationManager.getLastKnownLocation(
                LocationManager.GPS_PROVIDER); 

Zunächst einmal ist dies ein guter Ansatz, dies zu tun? Wenn es ist, überprüfen Sie bitte, was ich vermisse. Wenn nicht, können Sie mir bitte sagen, wie kann ich das besser umsetzen?

Vielen Dank. :)

+1

Einer der besseren writ-ups vor Ort in Android; http://android-developers.blogspot.com/2011/06/deep-dive-into-location.html - es Adressen die meisten Ihrer Fragen – tonys

+0

@tonys Danke Tonys, werde ich lesen, dass erste Sache. – Lev

+0

Das funktioniert einwandfrei: [Link Beschreibung hier eingeben] (http://stackoverflow.com/questions/21762293/run-gps-as-background-service-and-send-coordinates-to-web-server-php) –

Antwort

8

Zuerst können Sie sich nicht für Standortaktualisierungen registrieren und dann den Dienst herunterfahren. Im besten Fall werden Sie Gewinde verlieren. Im schlimmsten Fall wird Android Ihren Prozess beenden (Sie denken, dass nichts läuft) und Sie werden das Update nicht erhalten. Außerdem braucht GPS eine Weile, um sich aufzuwärmen, so dass Sie innerhalb von 20 Sekunden, insbesondere in einer städtischen Umgebung, keine Reparatur erhalten. Außerdem müssen Sie sicherstellen, dass das Gerät wach bleibt, während Sie versuchen, einen Fix zu sammeln.

Als Ergebnis ist periodische Standortkorrekturen im Hintergrund ein ziemlich kompliziertes Problem.

Ich schrieb eine jetzt eingestellte LocationPoller zu versuchen, dies zu adressieren, und another developer has forked and extended it. Sie könnten die Gabel ausprobieren oder einfach als Quelle für Ideen verwenden.

+0

10 Minuten nachdem ich das gepostet habe, bin ich auf deinen LocationPoller gestoßen. Der Strom ist ausgegangen, bevor ich die Quelle herunterladen konnte. :) Danke vielmals. – Lev

+0

Würden die 'requestLocationUpdates (String-Provider, long minTime, float minDistance, PendingIntent-Intent)' mit einem Manifest-registrierten Empfänger unter dem gleichen Problem leiden? Das heißt, wird der 'AlarmManager' verwendet, um den PendingIntent zu liefern (in welchem ​​Fall der Empfänger geweckt wird)? –

+0

@Mr_and_Mrs_D: Sorry, aber ich verstehe deine Fragen nicht. – CommonsWare

1

versuchen Sie dies:

AlarmManager.setRepeating(AlarmManager.RTC_WAKEUP,,,); 

Ich tue für einen aktuellen Standort mit GPS, aber mein Projekt arbeitet alle 10 Sekunden. Ich habe jetzt keine Ahnung. Und mein Code:

AlarmManager.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(),6000000,pi);