Ich versuche, Standort-Updates über FusedLocationProviderApi von Google zu abonnieren. Ich möchte Updates im Hintergrund erhalten, so dass ich auch dann Updates bekomme, wenn die App beendet wird. Nach der Online-Dokumentation so gut ich kann, habe ich den folgenden Code geschrieben. Hinweis: Dies geschieht in einem Intent-Service, nicht im UI-Thread. Aus diesem Grund verwende ich blockierende Verbindungs- / Ergebnismethoden.
%Vor% Wenn ich das ausführe, sehe ich, dass requestStatus.isSuccess()
true zurückgibt, was darauf hinweist, dass ich die Standortaktualisierungen erfolgreich abonniert habe. Darüber hinaus erhält The GeoBroadcastReciever
, das WakefulBroadcastReceiver
erweitert, eine Absicht mit dem richtigen Abfrageintervall und der richtigen Aktion. Gut so weit, so scheint es. Hier ist, was ich in der onReceive
-Methode für die GeoBroadcastReceiver
:
Das Problem ist, dass, wann immer die Absicht kommt, sie weder die LocationResult
noch die LocationAvailabilityResult
enthält. Ich habe die eingehende Absicht im Debugger untersucht, und das einzige Element in den Extras der Absicht ist das Extra, das ich beim Einrichten der Absicht hinzugefügt habe (die Geräte-ID). Daher gibt LocationResult.hasResult()
false zurück. Jedes einzelne Mal.
Ich habe dies auf einem Galaxy Note 4 mit 4.0.1 und einem Nexus 4 mit 5.1.1 versucht, mit dem gleichen Ergebnis.
Wenn ich den Standort auf dem Telefon deaktiviere, höre ich, wie erwartet, auf, Intents ganz zu empfangen.
Entfernen Sie die Extras aus der ausstehenden Absicht, andernfalls wird das Standortergebnis nicht übermittelt. Ich kann nicht finden, wo in der Dokumentation das erklärt wird, aber ich fand nach viel Versuch und Irrtum heraus.
Eine Umgehungslösung (Christophe Beyls schlug vor, nur Intent-Daten zu verwenden) Also, da ich nur ein paar Parameter senden muss, mache ich so etwas: beim Erstellen des Intents vor dem requestLocationUpdates: intent.setData (Uri.parse (" Ссылка ?" + Param1 + "?" + Param2 + "?" + Param3); und im BroadcastReceiver: String [] Parameter = intent.getDataString (). Split ("[?]"); Das funktioniert gut, und intent.getParcelableExtra (FusedLocationProviderApi.KEY_LOCATION_CHANGED) Gibt den Ort zurück.