Wo ist mein Android?
Man ließt hier im Forum ja ständig irgendwelche Fragen, Teil- und Komplettlösungen zum Thema Handy und Ortung. Scripte triggern in Abwesenheit und so weiter und so fort. Oft werden da irgendwelche Apps vorgestellt, die irgendwelche Aktionen ausführen, die wiederum irgendetwas anstoßen was dann aktiv abgefragt werden können. Zum Teil sehr fragile Konstrukte, die kompliziert aufgesetzt werden wollen und manchmal auch noch Geld kosten. Wenn man nach Handyortung googelt findet man haufenweise Lösungen die sogar ein Abo beinhalten. Dabei haben Google-Benutzer eigentlich schon alles fix und fertig - buchstäblich - in der Tasche. Und - bevor ihr fragt - meine Recherchen zeigten, dass es sogar fürs iPhone geht. Aber da müsst ihr euch selbst kümmern. Das kann ich hier mangels Hardware nicht testen.
Die Antwort heisst Google Latitude und jeder, der ein Android Handy hat, hat diesen Dienst bereits im Gratis-Abo, wenn es nicht manuell deinstalliert wurde. Versteckt ist er in Google Maps (Stichwort für die Apple-Fraktion) aber weil die Geräteortung schon „ein wenig“ in die Privatsphäre eingreift muss der Dienst separat aktiviert werden. Vernünftig.
Vorteile gegenüber anderen Lösungen
Google hat sich nicht lumpen lassen und die volle Power der eigenen Android-API genutzt. Die benötigte Software ist auf den meissten Geräten bereits vorhanden. Komplizierte Einstellungen entfallen völlig. Die Ortung erfolgt wegen der Genauigkeit vorzugsweise über GPS, kann aber auch über WLAN oder Mobilfunkmasten erfolgen. Letzteres hat den Vorteil, dass bei ausgeschaltetem GPS der Akku nicht zusätzlich belastet wird und sich die Laufzeit nicht verkürzt. Grad bei frühen Dualcore-Geräten im GHz-Bereich, wie meinem HTC Sensation, hält er bei normaler Benutzung ja eh nur etwa einen Tag. Ein echtes Plus in meinen Augen. Die Ortung per GPS funktionierte bei mir glaub ich nur wenn Google-Maps im Hintergrung gestartet war.
Da wir unsere Informationen direkt von Google in IPS bekommen brauchen wir diese Information nicht über irgendwelche Clouds oder Dienste kompliziert weiterleiten. Alles klappt „einfach so“ out of the Box. Wenn man, wie es mir mehrfach passiert ist, Google Maps versehendlich schließt, funktioniert die Ortung trotzdem. Dann aber nur über WLAN bzw GSM, also Mobilfunkmasten, und nicht mehr so präzise. Nach einigen Tests habe ich aber eh beschlossen, dass mir das auch ausreicht. Sogar auf dem Lande.
WLAN Ortung
Die Ortung per WLAN birgt die Gefahr, dass private Router nach einem Umzug der Eigentümer eine falsche Position gespeichert haben. Ich selbst hatte bei ner Freundin nach ihrem Umzug immer die falschen Wetterdaten auf dem Display. Dahinter steckt die selbe Technologie, die wir heute nutzen wollen. Ich kann nicht mehr sagen wo genau ich das damals korrigiert habe, aber das war im Netz schnell recherchiert und behoben.
Wer sein Zuhause oder seine Arbeitsstätte auch ohne GPS eingeschaltet haben zu müssen zuverlässig geortet haben möchte kann seinen Router in die Google-Datenbank eintragen. Das passiert sowiso irgendwann wenn die Google-Autos vorbei kommen und man nicht widersprochen hat. Beschleunigen kann man den Vorgang, nach nem Umzug zum Beispiel, wenn man sich mit seinem Handy über WLAN einbucht und GPS eingeschaltet ist. Wenn der GPS-Empfang gut genug ist wird die Position nach einer Weile, das kann schon mal einen Abend dauern, aktualisiert. Nun wird Latitude euch zuhause auch ohne eingeschaltetes GPS recht zuverlässig orten können.
GSM Ortung
Die Ortung per Mobilfunkmast klappte bei meinem Trip nach Hamburg hervorragend und war erschreckend präzise. Aber auf dem Lande hängt sie stark davon ab wo mein Gerät grad eingebucht ist. Da in dem Ort wo ich arbeite kein Sendemast steht springt die Anzeige immer zwischen den beiden Nachbarorten hin und her. Für eine Unterscheidung „Bin ich zu Hause, auf Arbeit, bei Freunden oder anderswo“ reicht es aber allemal.
Genug gequatscht - So gehts
Zunächst müssen wir den Dienst bei Google einschalten. Üblicherweise hat der stolze Eigentümer eines Android-Handys einen Benutzeraccount bei Google über den er sich zum Beispiel auch im „PlayStore“ (früher „AppStore“) einloggt. Unter www.google.de/latitude kann man damit einige wenige Einstellungen vornehmen. Aber mehr brauchen wir auch nicht. Oben rechts gibst den „Zahnrad-Button“ um an die „App-Einstellungen“ zu kommen. Eigentlich gibt es nur drei Optionen, die man wählen kann. „Nur die Stadt anzeigen“, „So genau wie möglich orten“ und „Deaktiviert“. Nun, Deaktiviert ist für uns hier die einzig schlechte Wahl. Der Rest liegt in Eurem Ermessen ;).
Weiter unten gibt es ein bissel HTML-Code, das sogenannte „Badge“, der für eure Webseiten und Blogs gedacht ist. WICHTIG: Wenn ihr den veröffentlicht kann jeder sehen wo ihr seid. Solange ihr das nicht tut kann niemand ohne euer Passwort an diese Informationen kommen. Wichtig zu wissen - find ich. So sieht dieser Badge aus:
<!-- Google Public Location Badge -->
<iframe src="http://www.google.de/latitude/apps/badge/api?user=1234567890123456789&type=iframe&maptype=roadmap&hl=de" width="180" height="300" frameborder="0"></iframe>
<!-- To disable location sharing, you *must* visit https://www.google.com/latitude/apps/badge and disable the Google Public Location badge. Removing this code snippet is not enough! -->
Wir interessieren uns jetzt für die URL. Dahinter verbirgt sich, fix und fertig, ein Script aus der Google-Maps API. Und das Beste: Wir brauchen uns um nichts mehr kümmern :D. Mit einem kleinen Script bekommen wir alle Daten, die wir brauchen. Ich hab euch das mal zusammen gepuzzelt.
$result = file_get_contents('http://www.google.de/latitude/apps/badge/api?user=12345678901234567890&type=iframe&maptype=roadmap&hl=de');
$result = substr($result, strpos($result, '¢er=')+8, PHP_INT_MAX);
$gps = substr($result, 0, strpos($result, '&')-1);
$result = substr($result, strpos($result, '"geocode"')+10, PHP_INT_MAX);
$ort = substr($result, 0, strpos($result, ','));
// in $ort steht schon alles wichtige drin. Der Rest ist nur für Berechnung der Entfernung
// von zuhaus. Wir gehen hier von Luftlinie aus.
// Die Koordinaten von zuhause - bekommt ihr bei Google maps raus. Rechtsklick auf euer
// Haus und dann auf "Was ist hier?" klicken.
$HomeLat = 53.890708;
$HomeLong = 8.680936;
// Koordinaten von Google
$PosLat = substr($gps, 0,strpos($gps, ','));
$PosLong = substr($gps, strpos($gps, ',')+1, PHP_INT_MAX);
$lat= ($PosLat+$HomeLat)/2*0.01745;
$dx = 111.3 * cos($lat)*($HomeLong-$PosLong);
$dy = 111.3 *($PosLat-$HomeLat);
$distanz = round(sqrt($dx*$dx+$dy*$dy));
print 'Ich bin in '.$ort.' - '.$distanz.'km von Zuhaus'; //Luftlinie
Wenn ihr Webfront-Verrückten (;)) eure Position grafisch darstellen wollt kann man die Geokoordinate auch als Parameter an google-maps übergeben. Das sieht dann so aus:
www.google.de/maps?hl=de&q=53.890708,8.680936
Wer es ein wenig hübscher und komfortabler haben möchte, dem empfehle ich sich die Google-Maps API einmal näher anzuschauen. Einstiegspunkt wäre zum Beispiel der Inhalt von $result (aus dem Script oben) direkt nach der esten Zeile. Ist aber nix für Anfänger.
Für Poweruser [Update]
Im Verlauf dieses Threads stellte sich heraus, dass einige es mit der Ortung doch lieber auf die Spitze treiben wollen und auf den Komfort einer genauen GPS Positionsbestimmung nicht verzichten wollen. Das war es zwar nicht was mir bei einer einfachen Lösung vorschwebte aber ich will euch das Ergebnis nicht vorenthalten. Aus diversen Scripten, die hier gepostet wurden hab ich euch also mal eine Lösung für Poweruser zusammen gestellt. Der Lob für die meisste Arbeit gebührt dabei jbu.
Wichtig ist bei dieser Lösung, dass bei eurem Badge in der URL der type auf &type=json geändert werden muss. Der Rest fliegt raus. So wie in meinem Beispiel hier.
// Koordinaten von zuhause - bekommt ihr bei Google maps raus. Rechtsklick auf euer Haus und
// dann auf "Was ist hier?" klicken.
$Home = '53.890708,8.680936';
$json = json_decode(file_get_contents('http://latitude.google.com/latitude/apps/badge/api?user=12345678901234567890&type=json'));
$Position = ($json->{'features'}[0]->{'geometry'}->{'coordinates'});
$Position = "$Position[1],$Position[0]";
// Routenplaner von Google Maps aufrufen
$Route = simplexml_load_file(utf8_encode('http://maps.google.com/maps/api/geocode/xml?address='.$Position.'&sensor=false'));
$Ort = utf8_decode($Route->result->formatted_address);
// $Ort = preg_replace("/, Germany/", "", $Ort); // Land entfernen wenn man das nicht angezeigt haben will
$Route = simplexml_load_file(utf8_encode('http://maps.google.ch/maps/api/directions/xml?origin='.$Position.'&destination='.$Home.'&sensor=false'));
$Zeit = $Route->route->leg->duration->text;
$Distanz = $Route->route->leg->distance->text; // Der Routenplaner gibt die Straßenkilometer aus.
print "
".$Ort.' - '.$Distanz.' von Zuhaus. Fahrzeit: '.$Zeit;
Google verwendet einen „smart positioning algorythm“ wie sie es nennen. Dabei wird die Position nicht so häufig aktualisiert wie wir es vielleicht gerne hätten. Aber da kann man was machen. Es gibt im Playstore zwei Apps, die Einstellungen der Aktualisierunghäufigkeit zu lassen. Die Eine heisst Backitude und ist kostenlos. Eine Zweite namens Latitude Update kostet einen kleinen Betrag.
Ich möchte noch schnell anmerken, dass so eine exzessive Ortung und Datenbank-Updaterei natürlich auch den Akku ganz anständig belasten. Ich hatte nicht erwartet, dass ich das erwähnen muss, aber der Verlauf dieses Threads hat mich eines besseren belehrt.
Privatspäre
Wenn ihr die Ortung wieder abschalten wollt, so müsst ihr das zwingend wieder auf der Google-Latitude Seite tun. Ein einfaches löschen des Scripts reicht hier nicht. Goggle weist an mehreren Stellen ausdrücklich darauf hin. Darum sag ich es hier auch noch einmal in aller Deutlichkeit.
Viel Spaß damit.
Gruß,
eurer Toni