Googles Android/ Positionsbestimmung

Aus Wikibooks

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