Android Development - Google Maps

Aus Wikizone
Wechseln zu: Navigation, Suche

Link auf Google Maps als Content Provider

// Possible geo uris:
// geo:lat,long
// geo:lat,long?z=zoom
// geo:0,0?q=AddressOrPlace
double latitude = 48.3895;
double longitude = 9.1869;
int zoom = 13;
String uriBegin = "geo:" + latitude + "," + longitude;
String query = latitude + "," + longitude;
String encodedQuery = Uri.encode(query);
String uriString = uriBegin + "?q=" + encodedQuery + "&z=" + zoom;
Uri uri = Uri.parse(uriString);
i = new Intent(android.content.Intent.ACTION_VIEW, uri);
showActivity(i);

MapView Activity

https://developers.google.com/maps/documentation/android/?hl=de //veraltet
https://developers.google.com/maps/documentation/android/intro
http://ddewaele.github.io/GoogleMapsV2WithActionBarSherlock/part1

Mit der Google Maps API v2 verändern sich ein paar Dinge:

  • Die API ist jetzt teil des Google Play services SDK
  • Maps sind jetzt in der MapFragment class gekapselt, einer Erweiterung der Fragment class. Dadurch kann man Karten als Teil einer größeren Activity nutzen. Die Karte kann auch Teil eines größeren UIs sein.
  • Als MapFragment Klasse kann man sie implementieren indem man die Standard Activity Klasse erweitert (statt der Erweiterung einer MapActivity in v1)
  • Vektorbasierte Kacheln -> schneller, weniger Speicher
  • Verbessertes Caching
  • 3D Funktionalität. Mittels User Viewpoint sind Karten mit Perspektive möglich.

Voraussetzungen

  • Google Play Services SDK muß installiert sein (SDK Manager)
  • In Eclipse muß folgendes Projekt importiert sein: myadtfolder/sdk/extras/google/google_play_services/libproject/google-play-services_lib damit die Packages zur Verfügung stehen.

Projekt und API Key

  • Project Properties > Android > Project Build Targets > Google APIs wählen
  • darunter bei Libaries die google-play-services_lib hinzufügen
  • Fingerprint holen
  • Registrieren auf der google developer console und API Schlüssel holen

Manifest Datei - Permissions und Key registrieren

Im Beispiel sind Permissions für diverse Zwecke rund um Kartendienste vorgesehen (siehe Kommentare)

vor application tag

<uses-library android:name="com.google.android.maps" />

Permissions (die erste nur bei Einsatz der ActionSherlock Toolbar)

<!-- Google Maps related permissions -->
<!-- <permission android:name="com.ecs.google.maps.v2.actionbarsherlock.permission.MAPS_RECEIVE" android:protectionLevel="signature"/> -->
<uses-permission android:name="com.example.mapdemo.permission.MAPS_RECEIVE"/>
 
<!-- Network connectivity permissions -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
 
<!-- Access Google based webservices -->
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
 
<!-- External storage for caching. -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<!-- My Location -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

<!-- Maps API needs OpenGL ES 2.0. -->
<uses-feature android:glEsVersion="0x00020000" android:required="true"/>

Im Application Tag wird der API-Key hinterlegt:

<meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="INSERT_YOUR_API_KEY_HERE"/>

Ein MapFragment hinzufügen

Wir fügen ein Map Fragment zum Standard Layout hinzu

Hinweis: Fragments gehen erst ab API11 - Honeycomb

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:id="@+id/root"
	android:layout_width="match_parent"
	android:layout_height="match_parent"
	android:orientation="horizontal" >

<fragment android:id="@+id/map"
		  android:layout_width="match_parent"
		  android:layout_height="match_parent"
		  android:name="com.google.android.gms.maps.MapFragment"/>
</FrameLayout> 

Abwärtskompatibilität

Um die neue Google Maps V2 API auf älteren Geräten zu nutzen muß man 3 Dinge tun:

  • Im Layout ein SupportMapFragment statt ein MapFragment nutzen
  • eine FragmentActivity statt einer Activity nutzen
  • Den SupportFragmentManager statt des FragmentManagers in der FragmentActivity nutzen:

activty_map_view.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:id="@+id/root"
	android:layout_width="match_parent"
	android:layout_height="match_parent"
	android:orientation="horizontal" >

<fragment
  android:id="@+id/map"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  class="com.google.android.gms.maps.SupportMapFragment"/>
</FrameLayout> 

MapViewActivity.java

package de.webmynet.android.location;

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;


public class MapViewActivity extends FragmentActivity{

	private SupportMapFragment mapFragment;
	private GoogleMap googleMap;

	@Override
	protected void onCreate(Bundle arg0) {
		super.onCreate(arg0);
		setContentView(R.layout.activity_map_view);
		
		mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
		googleMap = mapFragment.getMap();
		googleMap.setMyLocationEnabled(true);
		
	}
}

Activity Klasse

extends MapActivity