Googles Android/ Positionsbestimmung

Zurück zu Googles Android

Eine Vielzahl der heutigen Smartphone Apps kommt ohne die Bestimmung der eigenen Position nicht aus. Aus diesem Grund bietet Android eine einfache Schnittstelle, um diese Daten auszulesen und zu verwenden. Wie man die Position eines Android-Smartphones bestimmt, werden wir in diesem Kapitel kennen lernen.

Lokalisierung über GPS und Netzwerk Bearbeiten

Die Bestimmung der Position über GPS oder über das Netzwerk unterscheidet sich im Androidsystem nur hinsichtlich der Genauigkeit. Über beide Varianten erhalten wir Geokoordinaten (Latitude & Longitude). GPS-Daten sind dabei bis auf einige Meter genau, Daten über das Netzwerk können durchaus eine Toleranz von bis zu 1km haben, je nachdem wie weit man sich vom nächsten Router befindet, der seine Geokoordinaten kennt.

Wie man nun diese Koordinaten in Android erhält, sehen wir jetzt.

Code Bearbeiten

Zunächst muss man sich den LocationManager[1] vom Androidsystem holen, der für das Bereitstellen der Positionsdaten verantwortlich ist.

LocationManager locationManager = (LocationManager) this.getSystemService(LOCATION_SERVICE);

Um auch immer die aktuellsten Geodaten zu bekommen, braucht es noch einen LocationListener[2] der auf die Aktivitäten des LocationManagers reagiert:

LocationListener locationListener = new LocationListener() {

	// Wird Aufgerufen, wenn eine neue Position durch den LocationProvider bestimmt wurde
	public void onLocationChanged(Location location) {
		
		TextView tv = (TextView) this.findViewById(R.id.Latitude);
		tv.setText(String.valueOf(location.getLatitude()));
		
		...
    }

    public void onStatusChanged(String provider, int status, Bundle extras) {...}

    public void onProviderEnabled(String provider) {...}

    public void onProviderDisabled(String provider) {...}
  };

Als Letztes muss das Bestimmen der Position durch den LocationManager gestartet und dabei der Listener und der gewünschte LocationProvider[3] dem Manager übergeben werden.

locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);

Wenn man nicht die Position über das Netzwerk, sondern über GPS erhalten möchte, muss in requestLocationUpdates()[4] anstatt von LocationManager.NETWORK_PROVIDER der LocationManager.GPS_PROVIDER gesetzt werden.

Permissions Bearbeiten

Damit der obige Code auch genutzt werden kann, müssen noch zwei Permissions im Manifest-Files gesetzt werden.

Für die Positionierung über das Netzwerk benötigen wir:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>

Und für die Positionierung per GPS:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>

Diese einfachen Schritte sind alles was man braucht, um in einer Applikation die Position eines Smartphones zu bestimmen.

Bestimmung einer Adresse Bearbeiten

Mit Android ist es sogar möglich, sich aus den Geokoordinaten spezielle Ortsinformationen zu erhalten. Dazu benötigen wir eine Instanz des GeoCoder.[5]

Geocoder gc = new Geocoder(this);
		
List<Address> addressList=null;

try {
  addressList = gc.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
} catch (IOException e) {
  ...
}				
Address address = addressList.get(0);
System.out.println("Address: "+ address.getThoroughfare()+ " " + address.getSubThoroughfare());

Durch die Methode getFromLocation()[6] erhält man eine Liste von Adressen, die mit der Geokoordinate in Verbindung stehen. Die maximale Anzahl der Adressen können dabei begrenzt werden. Aus den Ergebnissen lassen sich Informationen wie Land, Postleitzahl, Stadt, Straße, Straßennummer etc. gewinnen.

Einzelnachweis Bearbeiten

  1. LocationManager: http://developer.android.com/reference/android/location/LocationManager.html. Stand 16. Februar 2011
  2. LocationListener: http://developer.android.com/reference/android/location/LocationListener.html. Stand 16. Februar 2011
  3. LocationProviderhttp://developer.android.com/reference/android/location/LocationProvider.html. Stand 16. Februar 2011
  4. requestLocationUpdates(): http://developer.android.com/reference/android/location/LocationManager.html#requestLocationUpdates%28java.lang.String,%20long,%20float,%20android.app.PendingIntent%29. Stand 16. Februar 2011
  5. GeoCoder: http://developer.android.com/reference/android/location/Geocoder.html. Stand 16. Februar 2011
  6. getFromLocation(): http://developer.android.com/reference/android/location/Geocoder.html#getFromLocation%28double,%20double,%20int%29. Stand 16. Februar 2011