Java Micro: Location-API

Die Location API wurde Entwickelt um die Ortung von J2ME fähigen Telefonen möglich zu machen. Sie bietet Funktionen um dies über GPS(Global Positioning System), also auf Satelliten-Navigations-System basierte Ortung. Hier können Informationen wie der Längen- und Breitengrad, die Höhe über dem Meeresspiegel oder auch die derzeitige Geschwindigkeit abgefragt werden. Für den GPS-Service ist natürlich ein GPS-Modul im Endgerät, aber auch eine neuere Version von Java Micro (CLDC 1.1 oder CDC) nötig.

Zum anderen gibt es die Möglichkeit GSM (Global System for Mobile Communications), welches eigentlich für die Datenübertragung(telefonieren, SMS) genutzt wird, indirekt zum orten des Telefons zu nutzen. Dafür stellt das Telefon eine Service-Anfrage an den Provider und bekommt somit Informationen über die Zelle(Cell-ID) mit der das Telefon aktuell verbunden ist. Weitere Serviceanfragen können Informationen über mcc (Mobile Country Code of the network, 3 digit integer) , mnc (Mobile Network Code of the network), enthalten. Es ist leider mit der Location API nicht möglich die Signalstärke oder weitere Cell-ID's naher Funktürme, wie es das Telefonbetriebsysteme macht, abzufragen. Trotzdem kann so eine Ortserfassung erfolgen, die je nach Aufenthaltsort unterschiedlich genau ist. So ist die Funkturm-Dichte in Städten viel höher als in ländlichen Regionen. Um die Cell-ID dann in Geodaten zu wandeln gibt es mehrere unterschiedlich große Datenbanken im Internet. Cell-ID's können dann mit Hilfe von Datenbanken in Geodaten umgewandelt werden. So bietet google den Zugriff auf eine Solche Datenbank, die für den deutschen Sprachraum fast komplett ist, kostenlos mit bis zu 100 anfragen am Tag an.

Implementierung eines ortsbezogenen Dienstes mit GPS Bearbeiten

Hierzu wird die Klasse javax.microedition.location.* benötigt. Bevor man das abrufen der Daten implementiert müssen zu erst Kriterien definiert werden unter welchen Bedingungen eine solches abrufen vollführt werden soll. Diese können z.B. auf die Genauigkeit, Kosten, ob Längen,- Breitengrade oder auch Höhe abgefragt werden sollen enthalten. Ob diese Funktionen angeboten werden unterscheidet sich von Anbieter zu Anbieter und kann natürlich auch von der Umgebung des Endgerätes abhängen. So ist es in geschlossenen Räumen meist schwer Geodaten zu erfassen. Kriterien werden wie folgt definiert:

Criteria criteria = new Criteria();
criteria.setHorizontalAccracy(200);  // horizontale Genauigkeit <= 200m
criteria.setVerticalAccracy(200);   // vertikale Genauigkeit <= 200m
criteria.setCostAllowed(false);   // keine Kosten
criteria.setSpeedAndCourseRequired(true);   // Geschwindigkeit und Richtung
criteria.setAltitudeRequired(true);   //  Höhe
 //Kann eines dieser Kriterien nicht erfüllt werden, so wird auch keine Anfrage gestellt.
 //Nun kann nach einem Service-Provider gesucht werden, der alle diese Bedingungen erfüllt.
try { 
      LocationProvider lp = LocationProvider.getInstance(criteria);
      //Wenn dieser gefunden wurde kann die eigentliche Anfrage gestellt werden.
  if(lp != null) {
     Location location = lp.getLocation(30); // hier werden die Daten abgerufen mit einer maximalen Wartezeit von 30sek
     if(location.isValid() {
            float speed = location.getSpeed(); //derzeitige Geschwindigkeit in m/s
            QualifiedCoordinates qlocation = location.getQualifiedCoordinates();   
           // QualifiedCoordinates ist eine Klasse in der die grundlegenden Locationinformationen gespeichert werden
           // Breitengrad, Längengrad usw.
           double laenggrad = qlocation.getLatitude();   //liefert Längengrad
           double breitengrad = qlocation.getLongitude();   //liefert Breitengrad
           double hoehe = qlocation.getAltitude();   // liefert Höhe
     }      
 }
} catch (LocationExeption e) {
    //exception ...
}

In anderen Fällen ist es vielleicht erwünscht Adressdaten zu erhalten, anstatt der Geodaten aus dem obigen Beispiel. Auch diese Funktionen werden von der Location API zur Verfügung gestellt. Sie bestehen im allgemeinen aus Straße, Hausnummer, Postleitzahl und Stadt. Diese Daten werden aus einem persistenten Datenspeicher geholt, in dem eine Zuweisung der Koordinaten in Straße etc. erfolgt. Implementiert wird so eine abfrage wie folgt:

Criteria criteria = new Criteria();
criteria.setLandAdressInforRequired(true);

try{
     LocationProvider lp = LocationProvider.getInstance(criteria);
     if(lp != null) {
           Location location = LocationProvider.getLocation(30);
           AdressInfo adressinfo = location.getAdressInfo();
           if ( adressinfo != null) {
                 String strasse = adressinfo.getField(AdressInfo.Street);
                 String plz = adressinfo.getField(AdressInfo.POSTAL_CODE);
                 String stadt = info.getField(AdressInfo.CITY);
          }
     }
} catch (LocationException e) {
//exception ...
}

Implementierung eines ortsbezogenen Dienstes mit GSM Bearbeiten

Wie bereits Oben geschildert ist es auch mit Hilfe von GSM-Informationen möglich ist die derzeitige Position des Telefons zu bestimmen. Hierfür gibt es eine Anzahl von Codes die für verschiedene Telefonanbieter benötigt werden. Hier eine Implementierung um die aktuelle Cell-ID herauszufinden.

    static String[] cellid={""Cell-ID"","com.nokia.mid.cellid","com.sonyericsson.net.cellid","phone.cid","com.samsung.cellid","com.siemens.cellid","cid"};
    //dies ist eine Sammlung von Codes für die meisten Mobiltelefone
    int i = 0;
    String mycellid;
    while(mycellid != null && i < cellid.length) {
         mycellid = System.getProperty(i); // abfrage an das Handy
         i++;
    }

Mit diesem Quellcode wird die aktuelle Cellid aus dem Handy ausgelesen. Leider ist die Entwicklung von dieser Art von Software nicht besonders Weit vorgedrungen und wird durch die große Verbreitung von GPS auch nicht mehr wirklich voran getrieben. Es ist trotzdem eine gute Möglichkeit unabhängig und ohne Netzprovidern zusätzliche Bewegungsprofile von Endnutzern zu geben.

Weitere Informationen befinden sich auf der Homepage: http://www.opencellid.org