Haupttitel der Präsentation 16.09.2018 WIFI Bundesland
Vorteile von location based services (LBS) Sehr viele Android-Geräte sind per GPS oder zumindest per WLAN-Triangulation fähig, deren Position bestimmen bzw. bestimmen zu lassen Aufgrund der bekannten Position kann eine App unter Verwendung von lokal gespeicherten Daten, WebServices, … dem Benutzer für ihn vor Ort relevante/interessante Informationen zeigen Weg nach Hause per öffentlichen Verkehrsmittel Lokale, Tankstellen, … Freunde, die in der Nähe sind Und vieles mehr
LBS Grundlagen Mehrere technische Möglichkeiten, um ein Gerät zu orten GPS wenn ein Sensor im Gerät verbaut ist und Empfang der Satelliten möglich WLAN wenn Gerät ein WLAN-Modul eingebaut hat, kann es sämtliche WLANs (deren SSID öffentlich ist) „sehen“ per Datenbank am Google Server ist es Android dann möglich, die Kombination von WLAN-SSIDs zu filtern und aufgrund der Bezeichnungen und der WLAN-Stärke die Position ansatzweise zu bestimmen Sendemasten Über Triangulation der erreichbaren Sendemaste, kann Android die Position ebenfalls bestimmen
Grundlagen Location based services LocationManager - Zentrales Element für LBS Position bestimmen Bewegung verfolgen Herausfinden, welche Provider zur Verfügung stehen Näherungsalarm auslösen LocationProvider Hier werden die verschiedenen Technologien verwendet LocationListener Achtet auf Positionsveränderung
LocationManager instanzieren LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); Für diese Instanzierung ist eine Berechtigung notwendig Es wird zwischen zwei Berechtigungen unterschieden android.permission.ACCESS_FINE_LOCATION android.permission.ACCESS_COARSE_LOCATION „Coarse“ bedeutet eine grobe Bestimmung der Position, „Fine“ eine deutlich genauere „ACCESS_FINE_LOCATION“ beinhaltet automatisch auch „COARSE“
Einsatz von LocationManager Es gibt drei verschiedene LocationProvider GPS_PROVIDER NETWORK_PROVIDER PASSIVE_PROVIDER Mit List<String> providers = lm.getProviders(true) erhält man eine Liste mit allen auf dem eingesetzten Gerät möglichen Providern Wenn man auf einen bestimmten Provider zugreifen möchte, kann man dies mit LocationProvider gps_prov = lm.getProvider(LocationManager.GPS_PROVIDER) tun
Zuletzt bekannten Standort feststellen Um den zuletzt bestimmten Standort des Systems abzurufen verwendet man den Befehl getLastKnownLocation(provider) Location loc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER) Zugriffe auf die verschiedenen Eigenschaften von Location werden mit den jeweiligen getXY() durchgeführt double lat=loc.getLatitude() double lng=loc.getLongitude()
Aktuellen Standort bestimmen Um den aktuellen Standort regelmäßig zu aktualisieren wird ein LocationListener eingesetzt LocationListener meinListener = new LocationListener() Dieser enthält Handler für Events wie locationChanged(), providerEnabled() und ähnliches Somit kann mit LocationListener auf Veränderungen des Standorts und auch auf Veränderungen von Providern (aufgedreht/abgedreht) reagiert werden Um den LocationListener einzusetzen verwendet man den Befehl lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,zeit,distanz,loc_listener) Falls keine Updates mehr stattfinden sollen lm.removeUpdates(loc_listener);
LocationListener loc_listener=new LocationListener() { @Override public void onStatusChanged(String arg0, int arg1, Bundle arg2) { } public void onProviderEnabled(String arg0) { public void onProviderDisabled(String arg0) { public void onLocationChanged(Location arg0) { //Location hat sich geändert
Innerhalb LocationListener onLocationChanged() { StringBuilder sb=new StringBuilder(); sb.append("Location ist "); sb.append("Lat: "+loc.getLatitude()); sb.append(" Long:"+loc.getLongitude()); Toast.makeText(getApplicationContext(), sb.toString(), Toast.LENGTH_SHORT).show(); } Finden der „besten Location“ http://developer.android.com/guide/topics/location/strategies.html
LocationManager als Beobachter Kann verwendet werden um zu beobachten, ob eine Location in die Nähe kommt lm.addProximityAlert(40, 40, 5, -1, intent); Zuerst Koordination, dann Radius (Meter), dann wie lange (-1 ist immer) intent ist ein PendingIntent PendingIntent intent= PendingIntent.getActivity(this, 0, new Intent(android.content.Intent.ACTION_VIEW, Uri.parse("http://www.wifiwien.at")),0);
Google-Maps Google-Maps NICHT Teil von Android Registrierung API-Key notwendig Gehört zu Google API Im Manifest muss die Ergänzung <uses-library android:name=„com.google.android.maps“/> stehen Für Abfragen von Koordinaten <> Adressen ist die Berechtigung android.permission.INTERNET notwendig Koordinaten von Adresse -> forward geocoding Adresse von Koordinaten -> reverse geocoding
Google Maps - Geocoder Instanzieren von Geocoder Geocoder coder = new Geocoder(getApplicationContext(), Locale.getDefault()) Forward geocoding List<Address> ergebnis = coder.getFromLocationName(adresse, max_anzahl) Reverse geocoding List<Address> adressen=null; adressen=gc.getFromLocation(lat,long,max_anzahl); Address ist eine Klasse zum Speichern von Adressen
Google Maps – MapView und MapActivity 1/3 MapView zeigt eine Google Map an MapActivity ist eine Subklasse von Aktivität und notwendig, wenn ein MapView eingesetzt werden soll MapController sind die Standard-Bedienelemente von MapViews Overlay kann über eine Map gelegt werden MyLocationOverlay – an der aktuellen Position ItemizedOverlays + OverlayItems – werden verwendet um Markierungen auf der Karte darzustellen
Google Maps – MapView und MapActivity 2/3 public class MeineMapAct extends MapActivity { private MapView mapView; private MapController mapController; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.map); mapView = (MapView)findViewById(R.id.map_view); mapController = mapView.getController(); } Im Layout gibt es da ein <com.google.android.maps.MapView> mit der id map_view
Google Maps – MapView und MapActivity 3/3 Eigenschaften, wie welche Sicht die MapView haben soll, werden über getXY() und setXY() gesetzt bzw. ausgelesen mapView.setTraffic(true); mapView.setBuiltInZoomControls(true); GeoPoint mitte = mapView.getMapCenter(); Der MapController (mapView.getController()) ebenfalls mapController.setCenter(new GeoPoint(40,40)); mapController.setZoom(15); //von 1-21 mapController.animateTo(new GeoPoint(0,0));
Overlays Werden in Schichten (layers) aufgetragen und dargestellt Vererben der Klasse Overlay, überschreiben von draw() public class MeinOverlay extends Overlay { @Override public void draw(Canvas canvas, MapView mapView, boolean shadow) { Projection proj = mapView.getProjection(); //zeichnen der gewünschten Darstellung }
Demonstration LocationManager LocationListener ProximityAlert Google Maps
Üben Erstellen Sie eine Applikation, bei der in den Einstellungen gespeichert wird (mittels SharedPrefs gespeichert), welche Nummer benachrichtigt werden soll. Wenn die Applikation in die Nähe einer bestimmten Location kommt, wird eine SMS an die hinterlegte Nummer gesendet Wenn eine SMS mit der Nachricht „WO! BIST! DU!“ kommt, wird SMS mit aktuellem Standort an eine hinterlegte Nummer gesendet. Die SMS soll nicht in den „normalen“ SMS aufscheinen Erstellen Sie eine App die nach der Eingabe einer Adresse verlangt und diese Eingabe dann auf einer Google Maps-Karte darstellt. Zudem soll es einen Button [Wo bin ich] geben, dessen Betätigung den aktuellen Standort auf der gleichen Google Maps-Karte anzeigt. Erstellen Sie eine App, die aus einer lokalen Datenbank ihnen wichtige Orte ausliest und die auf einer Google Map darstellt
Zusammenfassung