Location Updates unter Android sind so eine Sache. Man muss sich um einiges kümmern. Zum Beispiel ob es eine Last Known Location gibt, ob GPS an ist, wie lange darf es dauern bis ich einen GPS-fix bekomme und noch vieles mehr. Außerdem will ich meistens schnell ein Update, auch wenn dieses noch ungenau ist, damit ich dem Benutzer etwas anzeigen kann bis ich eine genaue Location bekommen.

Google Maps macht das so.

Ja das ist alles nichts Neues und wir haben das wahrscheinlich schon des Öfteren implementiert, aber wollen wir das wirklich immer wieder tun müssen? Ich für meinen Teil nicht.

Deshalb habe ich ein Library implementiert um dies zu vereinfachen. Der BestLocationProvider funktioniert sehr ähnlich wie der im Android SDK verbaute LocationManager und er basiert natürlich auch auf diesem, aber er nimmt uns einiges an Arbeit ab.

Funktionsweise

Der BestLocationProvider bekommt bei seiner Instanzierung den Applikationscontext, die Information darüber ob GPS und/oder Cell-Location Updates abgerufen werden sollen, Timeouts, also Zeiträume in Millisekunden wie lange ein LocationUpdate für einen Provider dauern darf bevor wir dies abbrechen um Akku zu sparen - in Millisekunden – und wie viele Sekunden minimal vergehen müssen und wie viele Meter man sich bewegt haben muss damit ein neues Update angefordert wird.

Select Code
BestLocationProvider mBestLocationProvider = new BestLocationProvider(context, true, true, 10000, 1000, 2, 0);

Der Provider erhält beim Starten einen Listener, welcher auch im Library definiert ist, um auf asynchrone Updates zu reagieren. Die dabei erzeugten Events sind im Prinzip die selben wie bei dem LocationManager des Android SDKs auf dem der BestLocationProvider ja basiert.

Der große Unterschied hier ist, dass wir sowohl den Provider bekommen, welcher das Update erzeugt hat, also auch ob die Location “fresh” ist. Ist “isFresh” false so ist dies eine “LastKnownLocation”.

Eine weitere Erweiterung des Listeners ist “onLocationUpdateTimeoutExceeded”. Dieses Event teilt uns mit, dass ein Provider in der von uns angegebenen Zeit kein Update erhielt. Das kann passieren wenn man zum Beispiel sehr schlechten GPS Empfang hat. Dies wäre der richtige Zeitpunkt um den betroffenen Provider zu deaktivieren um Akku zu sparen oder den Benutzer darüber zu informieren, dass man keine Location erhält.

OpenSource

Natürlich ist dieses Library, wie beinahe alles von mir, OpenSource und inklusive Demo App auf Github von mir veröffentlicht worden. Ich hoffe dies hilft einigen von euch bei eigenen Entwicklungen weiter.

Nehmt es, verwendet es, verbessert es.

Ganz wie es euch gefällt, aber eine Bitte hätte ich. Wenn ihr es in einer App im Einsatz habt erzählt mir davon. Ich freue mich immer wenn ich meinen Code in anderen Projekten wieder finde.

Projektbeschreibung und SampleCode

Projekt mit Demo App auf Github