Tonis Bastelkeller - Wo ist mein Android? [Updated]

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, '&center=')+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. :wink:

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

Erstmal Danke an Toni. Klappt Super.

Für Iphone Nutzer Einfach die APP Google Latitude Runterladen. Google Daten eingeben. Und schon Funktioniert es wie oben beschrieben.

Wobei ich sagen muss das die $gps Geo Daten nicht ganz genau sind . Laut Google sitze ich gerade 150 m von meinem Haus
entfernt auf einem Land und Schreibe hier ins Forum .

Ist bei mir auch so wenn GPS aus ist. Hast du GPS eingeschaltet? Wenn ja, was zeigt das denn für eine Position? Genauer als dein Handy weiss latitude das auch nicht. Und dann musst du ein bisschen Geduld haben. Die kommunizieren nicht direkt im Sekundentakt.

Ich habe GPS eingeschaltet , hast aber recht ist genau die Position die das IPhone ermittelt hat. Also hat google mal wieder als richtig gemacht. Hat sich nach ein paar Minuten auch eingependelt. Sitze jetzt laut Koordinaten immer hin im Nachbar Haus.:slight_smile:
Jetzt kann ich endlich den Quatsch mir Sosumi und MySQL und usw löschen. Wobei das auch gut funktioniert hat.

Danke Nochmal

Naja… GPS und geschossene Räume… Man kennt das ja :smiley:

Hi Toni,

wie immer wieder ein geniales Script/Idee --> DANKE

wie bekomm ich das im Webfront auch angezeigt? HTMLBox?
So klappts leider nicht, denn da wird kein Inhalt angezeigt


SetValueString(15868  /*[Program\Android-Google-Latitude\MAP]*/, '<iframe src="http://www.google.de/maps?hl=de&q='.$gps.'" width="100%" height="500" frameborder="0" scrolling="no"> </iframe>')

Puh… da muss ich passen… Hab kein Webfront im Einsatz.

Stell die Frage doch mal im passenden Unterforum. Bin mir sicher einer der Spezis weiss das sofort.

Toni

<iframe width="600"
height="350"
src="http://maps.google.de/maps?hl=de&q=53.890708,8.680936&ie=UTF8&t=&z=14&output=embed" frameborder="0" scrolling="no" ></iframe>

Das Zauberwort ist

output=embed

;).

perfekt, läuft einwandfrei :slight_smile: --> DANKE

Hallo,

bin hier gerade am verzweifeln. Wenn ich das badge direkt im Browser über den Link starte stimmen die Koordinaten und die Position wird Korrekt angezeigt.

Wenn ich die Koordinaten über Toni’s Script von der Google Api laden sind die um etwa 50m daneben. Wie kann das sein ?

Kann normal nicht. Ist ja die selbe „Webseite“. Wie hast du denn festgestellt, dass die Koordinaten falsch sind?

Toni

bevor ich jetzt lange rum probiere, ihr wisst das vielleicht eh gleich:

wie kann ich am einfachsten für die Anwesenheitserkennung einen Radius im mein Haus definieren mit den GPS Koordinaten? Da dies ab und an immer ein wenig schwankt…

Verkürze die Koordinaten um 1-2 Stellen, je nachdem, wie viel sich ändert.

Hallo Toni,

Du hast doch eine Printbefehl drin, der gibt die Koordinaten ja aus. bei Google kann ich mir ja die Koordinaten anzeigen lassen. Dort habe ich gesehen das die Koordinaten hinterm Komma abweichen.

Tja… dann ist das so. Es sind ein und die selben (nicht die gleichen) Daten, die du im Script und im Browser siehst.

Da Nachkommastellen wenige Zentimeter ausmachen können, wir aber nur ziviles GPS mit einer Genauigkeit um die 10-20m haben, zappeln die Nachkommastellen hin und her. Das ist eben so.

Aber wie kommst du auf die 50m? Vielleicht verrechnet?

Nein nicht verrechnet, nur geschätzt :smiley:
Danke für die Antwort, schönen Abend noch

GeTapatalk(t) mit meinem Galaxy Tab 10.1N

Ah, dann ist ja gut. Hatte mir schon den Kopf zerbrochen :smiley:

Dann hab ich auch nochmal ne blöde Frage zum Thema Webfront:

Wie bekomme ich jetzt zwei (oder mehr) Geräte in einer HTML Box angezeigt ?

Gruß
Martin

Ich rate mal ins Blaue: Mit zwei oder mehr HTMLBoxen oder zwei oder mehr IFrames in einer HTMLBox?

ich machs mit json.
Bei der Ausgabe wählen zwischen Karte oder Sattelit.

<?
$api = '12345678901234567890';
$json = file_get_contents("https://latitude.google.com/latitude/apps/badge/api?user=$api&type=json");
$json = json_decode($json);

$pos = ($json->{'features'}[0]->{'geometry'}->{'coordinates'});
$pos = "$pos[1],$pos[0]";
$ort = ($json->{'features'}[0]->{'properties'}->{'reverseGeocode'});
$zeit = ($json->{'features'}[0]->{'properties'}->{'timeStamp'});
$zeit = date("d.m.Y - H:i", $zeit);
//Satellitenbild
$ausgabe = '<img src="http://maps.google.com/maps/api/staticmap?center='.$pos.'&zoom=15&size=600x400&markers=icon:http://chart.apis.google.com/chart?chst=d_map_pin_icon%26chld=hotel%257C996600%7C'.$pos.'&sensor=true" />';
//Karte
$ausgabe = '<img src="http://maps.google.com/maps/api/staticmap?center='.$pos.'&zoom=16&size=800x800&maptype=satellite&markers=icon:http://chart.apis.google.com/chart?chst=d_map_pin_icon%26chld=hotel%257C996600%7C'.$pos.'&sensor=false" />';
SetValue(12345, $ausgabe); //Stringvariable HTML-Box

?>