1. Willkommen
Dieses Codelab ist Teil des Schulungskurses für fortgeschrittene Android-Entwicklung, der vom Google Developers Training-Team entwickelt wurde. Sie können den Kurs am besten nutzen, wenn Sie die Codelabs der Reihe nach durcharbeiten.
Ausführliche Informationen zum Kurs finden Sie in der Übersicht über die erweiterte Android-Entwicklung.
Einführung
Wenn Sie Apps mit Google Maps entwickeln, können Sie Ihrer App Funktionen wie Satellitenbilder, leistungsstarke UI-Steuerelemente, Standortverfolgung und Standortmarkierungen hinzufügen. Sie können die Standardkarte von Google Maps mit Informationen aus Ihrem eigenen Datensatz ergänzen, z. B. mit den Standorten bekannter Angel- oder Klettergebiete. Sie können auch Spiele erstellen, die an die reale Welt gebunden sind, wie Pokémon Go.
In diesem Praktikum erstellen Sie eine Google Maps App namens Wander.
Was Sie bereits wissen sollten
Sie sollten mit Folgendem vertraut sein:
- Grundlegende Funktionen von Google Maps.
- Laufzeitberechtigungen.
- Apps in Android Studio erstellen, entwickeln und ausführen
- Fügen Sie externe Bibliotheken in Ihre
build.gradle-Datei ein.
Lerninhalte
- Eine Google-Karte in Ihre App einbinden
- Verschiedene Kartentypen anzeigen
- Google Maps-Karte gestalten
- Fügen Sie Ihrer Karte Markierungen hinzu.
- Ermöglichen Sie dem Nutzer, eine Markierung auf einem POI zu platzieren.
- Aktivieren Sie die Standortermittlung.
- Aktivieren Sie Google Street View.
Aufgaben
- Rufen Sie einen API-Schlüssel über die Google API Console ab und registrieren Sie den Schlüssel für Ihre App.
- Erstellen Sie die
Wander-App mit einer eingebetteten Google-Karte. - Fügen Sie Ihrer App benutzerdefinierte Funktionen wie Markierungen, Formatierung und Standort-Tracking hinzu.
- Aktivieren Sie die Standortverfolgung und Street View in Ihrer App.
2. App-Übersicht
In dieser Übung erstellen Sie die Wander-App, eine formatierte Google-Karte. Mit der Wander App können Sie Markierungen auf Orte setzen, Ihren Standort in Echtzeit sehen und Street View-Panoramen ansehen.
|
|
3. Aufgabe 1: Projekt einrichten und API-Schlüssel abrufen
Für die Google Maps API ist wie für die Places API ein API-Schlüssel erforderlich. Um den API-Schlüssel zu erhalten, registrieren Sie Ihr Projekt in der Google API Console. Der API-Schlüssel ist an ein digitales Zertifikat gebunden, das die App mit ihrem Autor verknüpft. Weitere Informationen zur Verwendung digitaler Zertifikate und zum Signieren von Apps finden Sie unter App signieren.
In dieser Übung verwenden Sie den API-Schlüssel für das Debug-Zertifikat. Das Debugzertifikat ist von Natur aus unsicher, wie im Abschnitt Debug-Build signieren beschrieben. Für veröffentlichte Android-Apps, die die Google Maps API verwenden, ist ein zweiter API-Schlüssel erforderlich: der Schlüssel für das Release-Zertifikat. Weitere Informationen zum Abrufen eines Release-Zertifikats finden Sie unter API-Schlüssel abrufen.
Android Studio enthält eine Google Maps-Aktivitätsvorlage, mit der hilfreicher Vorlagencode generiert wird. Der Vorlagencode enthält eine Datei google_maps_api.xml mit einem Link, der das Abrufen eines API-Schlüssels vereinfacht.
1.1 Wander-Projekt mit der Maps-Vorlage erstellen
- Erstellen Sie ein neues Android Studio-Projekt.
- Geben Sie der neuen App den Namen „Wander“. Übernehmen Sie die Standardeinstellungen, bis Sie zur Seite Aktivität hinzufügen gelangen.
- Wählen Sie die Vorlage Google Maps-Aktivitäten aus.
- Behalten Sie die Standardwerte für Name der Aktivität und Name des Layouts bei.
- Ändern Sie den Titel in „Wander“ und klicken Sie auf Fertigstellen.
Android Studio erstellt mehrere zusätzliche Dateien, die mit Karten zusammenhängen:
google_maps_api**.xml**
In dieser Konfigurationsdatei speichern Sie Ihren API-Schlüssel. Mit der Vorlage werden zwei google_maps_api.xml-Dateien generiert: eine für das Debugging und eine für die Veröffentlichung. Die Datei für den API-Schlüssel für das Debug-Zertifikat befindet sich unter src/debug/res/values. Die Datei für den API-Schlüssel für das Releasezertifikat befindet sich in src/release/res/values. In dieser Übung verwenden wir nur das Debug-Zertifikat.
activity_maps.xml
Diese Layoutdatei enthält ein einzelnes Fragment, das den gesamten Bildschirm ausfüllt. Die Klasse SupportMapFragment ist eine abgeleitete Klasse der Klasse Fragment. Sie können SupportMapFragment in eine Layoutdatei einfügen, indem Sie in einem beliebigen ViewGroup ein <fragment>-Tag mit einem zusätzlichen Attribut verwenden:
android:name="com.google.android.gms.maps.SupportMapFragment"
MapsActivity.java
In der Datei MapsActivity.java wird die Klasse SupportMapFragment instanziiert und die Methode getMapAsync() der Klasse verwendet, um die Google-Karte vorzubereiten. Die Aktivität, die SupportMapFragment enthält, muss die Schnittstelle OnMapReadyCallback und die onMapReady()-Methode dieser Schnittstelle implementieren. Die Methode getMapAsync() gibt ein GoogleMap-Objekt zurück, das angibt, dass die Karte geladen wurde.
1.2 API-Schlüssel abrufen
- Öffnen Sie die Debug-Version der Datei
google_maps_api.xml.
Die Datei enthält einen Kommentar mit einer langen URL. Die Parameter der URL enthalten spezifische Informationen zu Ihrer App.
- Kopieren Sie die URL und fügen Sie sie in einen Browser ein.
- Folgen Sie der Anleitung, um ein Projekt in der Google API Console zu erstellen. Aufgrund der Parameter in der angegebenen URL wird die Google Maps Android API in der API Console automatisch aktiviert.
- Erstellen Sie einen API-Schlüssel und klicken Sie auf Schlüssel einschränken, um die Verwendung des Schlüssels auf Android-Apps zu beschränken. Der generierte API-Schlüssel sollte mit
AIzabeginnen. - Fügen Sie in der Datei
google_maps_api.xmlden Schlüssel in den Stringgoogle_maps_keyein, an der Stelle, an derYOUR_KEY_HEREsteht. - Führen Sie die App aus. In Ihrer Aktivität ist eine Karte eingebettet, auf der Sydney, Australien, mit einer Markierung versehen ist. Die Markierung für Sydney ist Teil der Vorlage und wird später geändert.
4. Aufgabe 2: Kartentypen und Markierungen hinzufügen
Google Maps bietet verschiedene Kartentypen: „Normal“, „Hybrid“, „Satellit“, „Gelände“ und „Keine“. In dieser Aufgabe fügen Sie eine App-Leiste mit einem Optionsmenü hinzu, über das der Nutzer den Kartentyp ändern kann. Sie verschieben den Startpunkt der Karte an Ihren eigenen Wohnort. Als Nächstes fügen Sie Unterstützung für Markierungen hinzu, mit denen einzelne Orte auf einer Karte gekennzeichnet werden können und die ein Label enthalten können.
2.1 Kartentypen hinzufügen
Welche Art von Karte der Nutzer benötigt, hängt davon ab, welche Informationen er benötigt. Wenn Sie Karten zur Navigation in Ihrem Auto verwenden, ist es hilfreich, Straßennamen deutlich zu sehen. Beim Wandern interessiert Sie wahrscheinlich eher, wie viele Höhenmeter Sie zurücklegen müssen, um den Gipfel zu erreichen. In diesem Schritt fügen Sie eine App-Leiste mit einem Optionsmenü hinzu, über das der Nutzer den Kartentyp ändern kann.
- Wenn Sie eine neue XML-Datei für das Menü erstellen möchten, klicken Sie mit der rechten Maustaste auf das Verzeichnis
resund wählen Sie Neu > Android-Ressourcendatei aus. - Geben Sie im Dialogfeld
map_optionsals Dateinamen ein. Wählen Sie Menü als Ressourcentyp aus. Klicken Sie auf OK. - Ersetzen Sie den Code in der neuen Datei durch den folgenden Code, um die Kartenoptionen zu erstellen. Der Kartentyp „none“ wird ausgelassen, da er dazu führt, dass keine Karte angezeigt wird.
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/normal_map"
android:title="@string/normal_map"
app:showAsAction="never"/>
<item android:id="@+id/hybrid_map"
android:title="@string/hybrid_map"
app:showAsAction="never"/>
<item android:id="@+id/satellite_map"
android:title="@string/satellite_map"
app:showAsAction="never"/>
<item android:id="@+id/terrain_map"
android:title="@string/terrain_map"
app:showAsAction="never"/>
</menu>
- Erstellen Sie String-Ressourcen für die
title-Attribute. - Ändern Sie in der Datei
MapsActivitydie Klasse so, dass sie die KlasseAppCompatActivityanstelle der KlasseFragmentActivityerweitert. Wenn SieAppCompatActivityverwenden, wird die App-Leiste und damit das Menü angezeigt. - Überschreiben Sie in
MapsActivitydie MethodeonCreateOptionsMenu()und blähen Sie die Dateimap_optionsauf:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.map_options, menu);
return true;
}
- Um den Kartentyp zu ändern, verwenden Sie die Methode
setMapType() für das ObjektGoogleMapund übergeben Sie eine der Kartentypkonstanten.
Überschreiben Sie die Methode onOptionsItemSelected(). Fügen Sie den folgenden Code ein, um den Kartentyp zu ändern, wenn der Nutzer eine der Menüoptionen auswählt:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Change the map type based on the user's selection.
switch (item.getItemId()) {
case R.id.normal_map:
mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
return true;
case R.id.hybrid_map:
mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
return true;
case R.id.satellite_map:
mMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
return true;
case R.id.terrain_map:
mMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
- Führen Sie die App aus. Verwenden Sie das Menü in der App-Leiste, um den Kartentyp zu ändern. Beachten Sie, wie sich die Darstellung der Karte ändert.
2.2 Standardkartenposition verschieben
Standardmäßig enthält der onMapReady()-Callback Code, mit dem eine Markierung in Sydney, Australien, platziert wird, wo Google Maps entwickelt wurde. Der Standard-Callback animiert die Karte auch so, dass sie auf Sydney geschwenkt wird. In diesem Schritt wird die Karte auf Ihren Wohnort zentriert, ohne dass eine Markierung gesetzt wird. Anschließend wird auf die von Ihnen angegebene Zoomstufe gezoomt.
- Entfernen Sie in der Methode
onMapReady()den Code, mit dem die Markierung in Sydney platziert und die Kamera bewegt wird. - Rufen Sie in Ihrem Browser www.google.com/maps auf und suchen Sie nach Ihrer Privatadresse.
- Klicken Sie mit der rechten Maustaste auf den Ort und wählen Sie Was ist hier? aus.
Unten auf dem Bildschirm wird ein kleines Fenster mit Standortinformationen wie Breitengrad und Längengrad eingeblendet.
- Erstellen Sie ein neues
LatLng-Objekt mit dem Namenhome. Verwenden Sie imLatLng-Objekt die Koordinaten, die Sie in Google Maps im Browser gefunden haben. - Erstellen Sie eine
float-Variable mit dem Namenzoomund legen Sie die gewünschte anfängliche Zoomstufe fest. Die folgende Liste gibt Ihnen einen Eindruck davon, welche Detailebene bei den einzelnen Zoomstufen angezeigt wird:
1: Welt5: Landmasse/Kontinent10: Stadt15: Straßen20: Gebäude
- Erstellen Sie ein
CameraUpdate-Objekt mitCameraUpdateFactory.newLatLngZoom()und übergeben Sie IhrLatLng-Objekt und diezoom-Variable. Schwenken und zoomen Sie die Kamera, indem SiemoveCamera()für dasGoogleMap-Objekt aufrufen und das neueCameraUpdate-Objekt übergeben:
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(home, zoom));
- Führen Sie die App aus. Die Karte sollte zu Ihrem Zuhause schwenken und auf die gewünschte Ebene zoomen.
2.3 Kartenmarkierungen hinzufügen
In Google Maps kann ein Ort mit einer Markierung hervorgehoben werden, die Sie mit der Klasse Marker erstellen. Für die Standardmarkierung wird das Google Maps-Standardsymbol verwendet: 
Sie können Markierungen erweitern, um Kontextinformationen in Infofenstern anzuzeigen.
In diesem Schritt fügen Sie eine Markierung hinzu, wenn der Nutzer einen Ort auf der Karte berührt und hält. Anschließend fügen Sie ein InfoWindow hinzu, in dem die Koordinaten der Markierung angezeigt werden, wenn auf die Markierung getippt wird.

- Erstellen Sie in
MapsActivityeinen Methoden-Stub namenssetMapLongClick(), der einfinalGoogleMapals Argument verwendet undvoidzurückgibt:
private void setMapLongClick(final GoogleMap map) {}
- Verwenden Sie die Methode
setOnMapLongClickListener()des ObjektsGoogleMap, um eine Markierung an der Stelle zu platzieren, an der der Nutzer tippt und hält. Übergeben Sie eine neue Instanz vonOnMapLongClickListener, die die MethodeonMapLongClick()überschreibt. Das eingehende Argument ist einLatLng-Objekt, das die Koordinaten des Standorts enthält, auf den der Nutzer getippt hat:
private void setMapLongClick(final GoogleMap map) {
map.setOnMapLongClickListener(new GoogleMap.OnMapLongClickListener() {
@Override
public void onMapLongClick(LatLng latLng) {
}
});
}
- Rufen Sie in
onMapLongClick()die MethodeaddMarker()auf. Übergeben Sie ein neuesMarkerOptions-Objekt, dessen Position auf den übergebenenLatLng-Wert festgelegt ist:
map.addMarker(new MarkerOptions().position(latLng));
- Rufen Sie
setMapLongClick()am Ende der MethodeonMapReady()auf. Übergeben Sie einen Wert fürmMap. - Starten Sie die App. Halten Sie die Karte gedrückt, um eine Markierung an einem Ort zu platzieren.
- Tippen Sie auf die Markierung, um sie auf dem Bildschirm zu zentrieren.
Navigationsschaltflächen werden unten links auf dem Bildschirm angezeigt. Der Nutzer kann damit die Google Maps App verwenden, um zur markierten Position zu navigieren.
So fügen Sie der Markierung ein Infofenster hinzu:
- Legen Sie im Objekt
MarkerOptionsdas Feldtitleund das Feldsnippetfest. - Legen Sie in
onMapLongClick()das Feldtitleauf „Markierung“ fest. Legen Sie das Feldsnippetin der MethodeaddMarker()auf die Standortkoordinaten fest.
map.setOnMapLongClickListener(new GoogleMap.OnMapLongClickListener() {
@Override
public void onMapLongClick(LatLng latLng) {
String snippet = String.format(Locale.getDefault(),
"Lat: %1$.5f, Long: %2$.5f",
latLng.latitude,
latLng.longitude);
map.addMarker(new MarkerOptions()
.position(latLng)
.title(getString(R.string.dropped_pin))
.snippet(snippet));
}
});
- Starten Sie die App. Halten Sie die Karte gedrückt, um eine Standortmarkierung zu setzen. Tippen Sie auf die Markierung, um das Infofenster aufzurufen.
2.4 POI-Listener hinzufügen
Standardmäßig werden Points of Interest (POIs) zusammen mit den entsprechenden Symbolen auf der Karte dargestellt. POIs sind beispielsweise Parks, Schulen und Behördengebäude. Wenn der Kartentyp auf normal festgelegt ist, werden auch Unternehmens-POIs auf der Karte angezeigt. Unternehmens-POIs sind beispielsweise Geschäfte, Restaurants und Hotels.
In diesem Schritt fügen Sie der Karte ein GoogleMap.OnPoiClickListener hinzu. Dieser Click-Listener platziert sofort eine Markierung auf der Karte, anstatt auf ein Berühren und Halten zu warten. Der Click-Listener zeigt auch das Infofenster mit dem Namen des POI an.

- Erstellen Sie in
MapsActivityeinen Methoden-Stub namenssetPoiClick(), der einfinalGoogleMapals Argument akzeptiert undvoidzurückgibt:
private void setPoiClick(final GoogleMap map) {}
- Legen Sie in der Methode
setPoiClick()einenOnPoiClickListenerfür das übergebeneGoogleMapfest:
map.setOnPoiClickListener(new GoogleMap.OnPoiClickListener() {
@Override
public void onPoiClick(PointOfInterest poi) {
}
});
- Platzieren Sie in der
onPoiClick()-Methode eine Markierung am POI-Standort. Legen Sie den Titel auf den Namen des POI fest. Speichern Sie das Ergebnis in einer Variablen namenspoiMarker.
public void onPoiClick(PointOfInterest poi) {
Marker poiMarker = mMap.addMarker(new MarkerOptions()
.position(poi.latLng)
.title(poi.name);
}
- Rufen Sie
showInfoWindow()fürpoiMarkerauf, um das Infofenster sofort anzuzeigen.
poiMarker.showInfoWindow();
- Rufen Sie
setPoiClick()am Ende vononMapReady()auf. Übergeben Sie einen Wert fürmMap. - Führen Sie Ihre App aus und suchen Sie nach einem POI, z. B. einem Park. Tippen Sie auf den POI, um eine Markierung darauf zu platzieren und den Namen des POI in einem Infofenster anzuzeigen.
5. Aufgabe 3: Karte gestalten
Sie können Google Maps auf vielfältige Weise anpassen und Ihrer Karte so ein einzigartiges Erscheinungsbild verleihen.
Sie können ein MapFragment-Objekt mit den verfügbaren XML-Attributen anpassen, wie Sie es auch bei anderen Fragmenten tun würden. In diesem Schritt passen Sie jedoch das Erscheinungsbild des Inhalts des MapFragment mit Methoden für das GoogleMap-Objekt an. Mit dem Styling Wizard können Sie Ihrer Karte einen Stil hinzufügen und Ihre Markierungen anpassen. Außerdem fügen Sie Ihrem Zuhause ein GroundOverlay hinzu, das mit der Karte skaliert und gedreht wird.
3.1 Karte einen Stil hinzufügen
Wenn Sie einen benutzerdefinierten Stil für Ihre Karte erstellen möchten, generieren Sie eine JSON-Datei, in der angegeben wird, wie die Elemente auf der Karte dargestellt werden.Sie müssen diese JSON-Datei nicht manuell erstellen: Google stellt den Styling Wizard zur Verfügung, der die JSON-Datei für Sie generiert, nachdem Sie Ihre Karte visuell gestaltet haben. In diesem Praktikum gestalten Sie die Karte für den „Nachtmodus“. Das bedeutet, dass die Karte für die Verwendung bei Nacht dunkle Farben und einen geringen Kontrast verwendet.
- Rufen Sie in Ihrem Browser https://mapstyle.withgoogle.com/ auf.
- Wählen Sie Stil erstellen aus.
- Wählen Sie das Design Nacht aus.
- Klicken Sie unten im Menü auf Weitere Optionen.
- Wählen Sie unten in der Liste Elementtyp die Option Wasser > Füllung aus. Ändern Sie die Farbe des Wassers in ein dunkles Blau (z. B. #160064).
- Klicken Sie auf Fertig. Kopieren Sie den JSON-Code aus dem angezeigten Pop-up-Fenster.
- Erstellen Sie in Android Studio im Verzeichnis
resein Ressourcenverzeichnis mit dem Namenraw. Erstellen Sie im Ordnerres/raweine Datei mit dem Namenmap_style.json. - Fügen Sie den JSON-Code in die neue Ressourcendatei ein.
- Rufen Sie
setMapStyle()für dasGoogleMap-Objekt auf, um den JSON-Stil für die Karte festzulegen. Übergeben Sie einMapStyleOptions-Objekt, um die JSON-Datei zu laden. Die MethodesetMapStyle()gibt einen booleschen Wert zurück, der angibt, ob das Styling erfolgreich war. Wenn die Datei nicht geladen werden kann, wird von der Methode eineResources.NotFoundExceptionausgelöst.
Kopieren Sie den folgenden Code in die onMapReady()-Methode, um die Karte zu gestalten. Möglicherweise müssen Sie einen TAG-String für Ihre Log-Anweisungen erstellen:
try {
// Customize the styling of the base map using a JSON object defined
// in a raw resource file.
boolean success = googleMap.setMapStyle(
MapStyleOptions.loadRawResourceStyle(
this, R.raw.map_style));
if (!success) {
Log.e(TAG, "Style parsing failed.");
}
} catch (Resources.NotFoundException e) {
Log.e(TAG, "Can't find style. Error: ", e);
}
- Führen Sie Ihre App aus. Der neue Stil sollte sichtbar sein, wenn sich die Karte im Modus
normalbefindet.

3.2 Markierung gestalten
Sie können Ihre Karte weiter personalisieren, indem Sie die Kartenmarkierungen gestalten. In diesem Schritt ändern Sie die roten Standardmarkierungen, damit sie dem Farbschema des Nachtmodus entsprechen.
- Fügen Sie in der Methode
onMapLongClick()dem KonstruktorMarkerOptions()die folgende Codezeile hinzu, um die Standardmarkierung zu verwenden, aber die Farbe in Blau zu ändern:
.icon(BitmapDescriptorFactory.defaultMarker
(BitmapDescriptorFactory.HUE_BLUE))
- Führen Sie die App aus. Die platzierten Markierungen sind jetzt blau schattiert, was besser zum Nachtmodus der App passt.
POI-Markierungen sind weiterhin rot, da Sie der onPoiClick()-Methode kein Styling hinzugefügt haben.
3.3 Overlay hinzufügen
Eine Möglichkeit, die Google-Karte anzupassen, besteht darin, darauf zu zeichnen. Diese Technik ist nützlich, wenn Sie einen bestimmten Ortstyp hervorheben möchten, z. B. beliebte Angelplätze. Es werden drei Arten von Overlays unterstützt:
- Formen: Sie können der Karte Polylinien, Polygone und Kreise hinzufügen.
TileOverlay-Objekte: Ein Kachel-Overlay definiert eine Reihe von Bildern, die über den Kacheln der Basiskarte hinzugefügt werden. Kachel-Overlays sind hilfreich, um der Karte umfassendes Bildmaterial hinzuzufügen. Ein typisches Kachel-Overlay deckt ein großes geografisches Gebiet ab.GroundOverlay-Objekte: Ein Boden-Overlay ist ein Bild, das auf einer Karte fixiert ist. Im Unterschied zu Markierungen sind Boden-Overlays an der Erdoberfläche und nicht am Bildschirm ausgerichtet. Wenn Sie die Karte drehen, neigen oder zoomen, ändert sich die Ausrichtung des Bildes. Boden-Overlays sind nützlich, um ein einzelnes Bild an einem Punkt der Karte zu fixieren.
In diesem Schritt fügen Sie Ihrer Wohnadresse ein Boden-Overlay in Form eines Android hinzu.
- Laden Sie dieses Android-Image herunter und speichern Sie es im Ordner
res/drawable. - Erstellen Sie in
onMapReady()nach dem Aufruf zum Verschieben der Kamera in die Startposition einGroundOverlayOptions-Objekt. Weisen Sie das Objekt einer Variablen mit der BezeichnunghomeOverlayzu:
GroundOverlayOptions homeOverlay = new GroundOverlayOptions();
- Verwenden Sie die Methode
BitmapDescriptorFactory.fromResource(), um einBitmapDescriptor-Objekt aus dem oben genannten Bild zu erstellen. Übergeben Sie das Objekt an die Methodeimage()desGroundOverlayOptions-Objekts:
GroundOverlayOptions homeOverlay = new GroundOverlayOptions()
.image(BitmapDescriptorFactory.fromResource(R.drawable.android));
- Legen Sie die
position-Eigenschaft für dasGroundOverlayOptions-Objekt fest, indem Sie dieposition()-Methode aufrufen. Übergeben Sie dashome-LatLng-Objekt und einenfloatfür die Breite des gewünschten Overlays in Metern. In diesem Beispiel funktioniert eine Breite von 100 m gut:
GroundOverlayOptions homeOverlay = new GroundOverlayOptions()
.image(BitmapDescriptorFactory.fromResource(R.drawable.android))
.position(home, 100);
- Rufen Sie
addGroundOverlay()für dasGoogleMap-Objekt auf. Übergeben Sie IhrGroundOverlayOptions-Objekt:
mMap.addGroundOverlay(homeOverlay);
- Führen Sie die App aus. Zoomen Sie auf Ihren Wohnort. Das Android-Bild wird als Overlay angezeigt.
6. Aufgabe 4: Standortverfolgung und Street View aktivieren
Nutzer verwenden Google Maps häufig, um ihren aktuellen Standort zu sehen. Sie können den Gerätestandort mit der Location Services API abrufen. Wenn Sie den Gerätestandort auf Ihrer Karte anzeigen möchten, ohne Location-Daten weiter zu verwenden, können Sie die Standortdatenebene verwenden.
Durch die Ebene mit Standortdaten wird rechts oben auf der Karte die Schaltfläche Mein Standort hinzugefügt. Wenn der Nutzer auf die Schaltfläche tippt, wird die Karte auf den Standort des Geräts zentriert. Der Standort wird als blauer Punkt angezeigt, wenn das Gerät sich nicht bewegt, und als blauer Navigationspfeil, wenn das Gerät in Bewegung ist.

Mit Google Street View können Sie zusätzliche Informationen zu einem Ort bereitstellen. Street View ist ein navigierbares Panoramabild eines bestimmten Orts.
In dieser Aufgabe aktivieren Sie die Ebene mit Standortdaten und Street View, sodass die Karte in den Street View-Modus wechselt, wenn der Nutzer auf das Infofenster für die POI-Markierung tippt.
4.1 Standortermittlung aktivieren
Um die Standortverfolgung in Google Maps zu aktivieren, ist nur eine Codezeile erforderlich. Sie müssen jedoch dafür sorgen, dass der Nutzer Standortberechtigungen erteilt hat (mit dem Laufzeitberechtigungsmodell).
In diesem Schritt fordern Sie Berechtigungen zur Standortermittlung an und aktivieren die Standortermittlung.
- Prüfen Sie in der Datei
AndroidManifest.xml, ob die BerechtigungFINE_LOCATIONbereits vorhanden ist. Android Studio hat diese Berechtigung eingefügt, als Sie die Google Maps-Vorlage ausgewählt haben. - Wenn Sie die Standortverfolgung in Ihrer App aktivieren möchten, erstellen Sie in
MapsActivityeine Methode namensenableMyLocation(), die keine Argumente akzeptiert und nichts zurückgibt. - Definieren Sie die Methode
enableMyLocation(). Prüfen Sie, ob Sie die BerechtigungACCESS_FINE_LOCATIONhaben. Wenn die Berechtigung erteilt wurde, aktivieren Sie die Standortebene. Andernfalls fordern Sie die Berechtigung an:
private void enableMyLocation() {
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED) {
mMap.setMyLocationEnabled(true);
} else {
ActivityCompat.requestPermissions(this, new String[]
{Manifest.permission.ACCESS_FINE_LOCATION},
REQUEST_LOCATION_PERMISSION);
}
}
- Rufen Sie
enableMyLocation()über denonMapReady()-Callback auf, um die Standortebene zu aktivieren. - Überschreiben Sie die Methode
onRequestPermissionsResult(). Wenn die Berechtigung erteilt wurde, rufen SieenableMyLocation()auf:
@Override
public void onRequestPermissionsResult(int requestCode,
@NonNull String[] permissions,
@NonNull int[] grantResults) {
// Check if location permissions are granted and if so enable the
// location data layer.
switch (requestCode) {
case REQUEST_LOCATION_PERMISSION:
if (grantResults.length > 0
&& grantResults[0]
== PackageManager.PERMISSION_GRANTED) {
enableMyLocation();
break;
}
}
}
- Führen Sie die App aus. Rechts oben wird jetzt die Schaltfläche Mein Standort angezeigt, über die der aktuelle Standort des Geräts aufgerufen werden kann.
4.2 Street View aktivieren
Google Maps bietet Street View, eine Panoramaansicht eines Orts mit Steuerelementen für die Navigation auf einem bestimmten Pfad. Street View ist nicht weltweit verfügbar.
In diesem Schritt aktivieren Sie ein Street View-Panorama, das aktiviert wird, wenn der Nutzer auf das Infofenster eines POI tippt. Dazu sind zwei Schritte erforderlich:
- POI-Markierungen von anderen Markierungen unterscheiden, da die Funktionen Ihrer App nur für POI-Markierungen funktionieren sollen. So können Sie Street View starten, wenn der Nutzer auf ein POI-Infofenster tippt, aber nicht, wenn er auf eine andere Art von Markierung tippt.
Die Klasse Marker enthält die Methode setTag(), mit der Sie Daten anhängen können. Die Daten können alles sein, was sich aus Object ergibt. Sie legen ein Tag für die Markierungen fest, die erstellt werden, wenn Nutzer auf POIs klicken.
- Wenn der Nutzer in einem
OnInfoWindowClickListenerauf ein getaggtes Infofenster tippt, ersetzen SieMapFragmentdurchStreetViewPanoramaFragment. Im folgenden Code werdenSupportMapFragmentundSupportStreetViewPanoramaFragmentverwendet, um Android-Versionen unter API 12 zu unterstützen.
Wenn sich eines der Fragmente zur Laufzeit ändert, müssen Sie es in der enthaltenden Activity-Klasse und nicht statisch in XML hinzufügen.
POI-Markierung taggen
- Rufen Sie im
onPoiClick()-CallbacksetTag()fürpoiMarkerauf. Einen beliebigen String übergeben:
poiMarker.setTag("poi");
Statisches SupportMapFragment durch eine Laufzeitinstanz ersetzen
- Öffnen Sie
activity_maps.xmlund ändern Sie das Element in ein Frame-Layout, das als Container für Ihre Fragmente dient:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
- Entfernen Sie in
onCreate()inMapsActivityden Code, der dieSupportMapFragmentanhand der ID findet, da es in der XML-Datei keine statischeSupportMapFragmentmehr gibt. Erstellen Sie stattdessen eine neue Laufzeitinstanz vonSupportMapFragment, indem SieSupportMapFragment.newInstance()aufrufen:
SupportMapFragment mapFragment = SupportMapFragment.newInstance();
- Fügen Sie das Fragment dem
FrameLayoutmit einer Fragmenttransaktion mit demFragmentManagerhinzu:
getSupportFragmentManager().beginTransaction()
.add(R.id.fragment_container, mapFragment).commit();
- Behalten Sie die Codezeile bei, die das asynchrone Laden der Karte auslöst:
mapFragment.getMapAsync(this);
OnInfoWindowClickListener festlegen und Marker-Tag prüfen
- Erstellen Sie in
MapsActivityeinen Methoden-Stub namenssetInfoWindowClickToPanorama(), derGoogleMapals Argument verwendet undvoidzurückgibt:
private void setInfoWindowClickToPanorama(GoogleMap map) {}
- Legen Sie für
GoogleMapeineOnInfoWindowClickListenerfest:
map.setOnInfoWindowClickListener(
new GoogleMap.OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick(Marker marker) {
}
});
- Prüfen Sie in der
onInfoWindowClick()-Methode, ob die Markierung das String-Tag enthält, das Sie in deronPoiClick()-Methode festgelegt haben:
if (marker.getTag() == "poi") {}
SupportMapFragment durch ein SupportStreetViewPanoramaFragment ersetzen
- Wenn die Markierung das Tag enthält, geben Sie den Ort für das Street View-Panorama mit einem
StreetViewPanoramaOptions-Objekt an. Legen Sie dieposition-Eigenschaft des Objekts auf die Position der übergebenen Markierung fest:
StreetViewPanoramaOptions options =
new StreetViewPanoramaOptions().position(
marker.getPosition());
- Erstellen Sie eine neue Instanz von
SupportStreetViewPanoramaFragmentund übergeben Sie das erstellteoptions-Objekt:
SupportStreetViewPanoramaFragment streetViewFragment
= SupportStreetViewPanoramaFragment
.newInstance(options);
- Starten Sie eine Fragmenttransaktion. Ersetzen Sie den Inhalt des Fragment-Containers durch das neue Fragment
streetViewFragment. Fügen Sie die Transaktion dem Backstack hinzu, damit durch Drücken der Zurück-Taste zurSupportMapFragmentzurückgekehrt wird und die App nicht beendet wird:
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment_container,
streetViewFragment)
.addToBackStack(null).commit();
- Rufen Sie
setInfoWindowClickToPanorama(mMap)inonMapReady()nach dem Anruf beisetPoiClick().auf. - Starten Sie die App. Zoomen Sie in eine Stadt mit Street View-Abdeckung, z. B. Mountain View (Sitz des Google-Hauptquartiers), und suchen Sie nach einem POI, z. B. einem Park. Tippen Sie auf den POI, um eine Markierung zu setzen und das Infofenster aufzurufen. Tippen Sie auf das Infofenster, um den Street View-Modus für den Standort der Markierung aufzurufen. Drücke die Zurück-Taste, um zum Kartenausschnitt zurückzukehren.

7. Lösungscode
Wander-Lösungscode.
8. Coding-Herausforderung
Herausforderung:Wenn Sie auf das Infofenster für einen POI an einem Ort tippen, an dem es keine Street View-Abdeckung gibt, sehen Sie einen schwarzen Bildschirm.
- Wenn Sie prüfen möchten, ob Street View in einem Gebiet verfügbar ist, implementieren Sie den
OnStreetViewPanomaraReady-Callback in Kombination mitStreetViewPanorama.OnStreetViewPanoramaChangeListener. - Wenn Street View in einem ausgewählten Bereich nicht verfügbar ist, kehren Sie zum Kartenausschnitt zurück und zeigen Sie einen Fehler an.
9. Zusammenfassung
- Wenn Sie die Maps API verwenden möchten, benötigen Sie einen API-Schlüssel aus der Google API Console.
- Wenn Sie in Android Studio die Google Maps Activity-Vorlage verwenden, wird ein
Activitymit einem einzelnenSupportMapFragmentim Layout der App generiert. Die Vorlage fügt dem App-Manifest auch dieACCESS_FINE_PERMISSIONhinzu, implementiert dieOnMapReadyCallbackin Ihrer Aktivität und überschreibt die erforderlicheonMapReady()-Methode.
Wenn Sie den Kartentyp eines GoogleMap zur Laufzeit ändern möchten, verwenden Sie die Methode GoogleMap.setMapType(). Eine Google-Karte kann einen der folgenden Kartentypen haben:
- Normal: Typische Straßenkarte. Straßen, einige von Menschen geschaffene Merkmale und wichtige Landschaftsmerkmale wie Flüsse werden angezeigt. Die Straßen und sonstigen Merkmale sind beschriftet.
- Hybrid: Enthält Satellitenfotodaten mit zusätzlichen Straßenkarten. Die Straßen und sonstigen Merkmale sind beschriftet.
- Satellit: Fotodaten. Straßen und sonstige Merkmale sind nicht beschriftet.
- Gelände: Topografische Daten. Die Karte enthält Farben, Höhenlinien und Labels sowie perspektivische Schattierungen. Außerdem werden einige Straßen und Labels dargestellt.
- Keine**: Keine Karte.
Über Google Maps:
- Eine Markierung ist ein Indikator für einen bestimmten geografischen Standort.
- Wenn auf die Markierung getippt wird, wird standardmäßig ein Infofenster mit Informationen zum Ort eingeblendet.
- Standardmäßig werden Points of Interest (POIs) zusammen mit ihren Icons auf der Karte dargestellt. POIs sind beispielsweise Parks, Schulen und Behördengebäude.
- Darüber hinaus werden Unternehmens-POIs (Geschäfte, Restaurants, Hotels usw.) standardmäßig auf der Karte angezeigt, wenn der Kartentyp
normalist. - Sie können Klicks auf POIs mit
OnPoiClickListenererfassen. - Mit dem Styling-Assistenten können Sie die Darstellung fast aller Elemente einer Google-Karte ändern. Mit dem Styling Wizard wird eine JSON-Datei generiert, die Sie mit der Methode
setMapStyle()an die Google-Karte übergeben. - Sie können die Markierungen anpassen, indem Sie die Standardfarbe ändern oder das Standardmarkierungssymbol durch ein benutzerdefiniertes Bild ersetzen.
Weitere wichtige Informationen:
- Mit einem Boden-Overlay können Sie ein Bild an einem geografischen Ort fixieren.
- Verwenden Sie ein
GroundOverlayOptions-Objekt, um das Bild, die Größe des Bildes in Metern und die Position des Bildes anzugeben. Übergeben Sie dieses Objekt an die MethodeGoogleMap.addGroundOverlay(), um das Overlay auf der Karte zu platzieren. - Sofern Ihre App die Berechtigung
ACCESS_FINE_LOCATIONhat, können Sie die Standortverfolgung mit der MethodemMap.setMyLocationEnabled(true)aktivieren. - Google Street View bietet 360-Grad-Panoramaansichten für bestimmte Straßen in seinem Abdeckungsbereich.
- Verwenden Sie die Methode
StreetViewPanoramaFragment.newInstance(), um ein neues Street View-Fragment zu erstellen. - Verwenden Sie ein
StreetViewPanoramaOptions-Objekt, um die Optionen für die Ansicht anzugeben. Übergeben Sie das Objekt an die MethodenewInstance().
10. Weitere Informationen
Die zugehörige Konzeptdokumentation finden Sie unter 9.1: Google Maps API.
Android-Entwicklerdokumentation:
- Erste Schritte mit der Google Maps Android API
- Karte mit einer Markierung hinzufügen
- Kartenobjekte
- Karte mit benutzerdefinierten Stilen hinzufügen
- Street View
- Boden-Overlays
Referenzdokumentation:
11. Aufgaben
In diesem Abschnitt werden mögliche Hausaufgaben für Schüler und Studenten aufgeführt, die dieses Codelab im Rahmen eines Kurses durcharbeiten. Es liegt in der Verantwortung des Kursleiters, Folgendes zu tun:
- Weisen Sie bei Bedarf Aufgaben zu.
- Teilen Sie den Schülern/Studenten mit, wie sie Hausaufgaben abgeben können.
- Benoten Sie die Hausaufgaben.
Lehrkräfte können diese Vorschläge nach Belieben nutzen und auch andere Hausaufgaben zuweisen, die sie für angemessen halten.
Wenn Sie dieses Codelab selbst durcharbeiten, können Sie Ihr Wissen mit diesen Hausaufgaben testen.
App erstellen und ausführen
- Erstellen Sie eine neue App mit der Google Maps-Aktivitätsvorlage. Dadurch wird Google Maps beim Starten der App geladen.
- Wenn die Google-Karte geladen ist, bewegen Sie die Kamera zum Standort Ihrer Schule, Ihres Zuhauses oder eines anderen für Sie wichtigen Ortes.
- Fügen Sie der Karte zwei Markierungen hinzu, eine für den Standort Ihrer Bildungseinrichtung und eine für Ihren Wohnort oder einen anderen wichtigen Ort.
- Sie können die Markierungssymbole anpassen, indem Sie die Standardfarbe ändern oder das Standardmarkierungssymbol durch ein benutzerdefiniertes Bild ersetzen.
Hinweis:Weitere Informationen finden Sie in der Dokumentation zu onMapReady (GoogleMap googleMap).
Beantworten Sie diese Fragen
Frage 1
Welche Methode wird aufgerufen, wenn die Karte geladen und in der App verwendet werden kann?
onMapReady (GoogleMapgoogleMap)onMapLoaded (GoogleMapgoogleMap)onMapCreate (GoogleMapgoogleMap)onMapInitialize (GoogleMapgoogleMap)
Frage 2
Welche Android-Komponenten können Sie verwenden, um Google Maps in Ihre App einzubinden?
MapViewundMapFragmentMapFragmentundMapActivityMapViewundMapActivity- Nur
MapFragment
Frage 3
Welche Arten von Karten bietet die Google Maps Android API?
- Normal, Hybrid, Gelände, Satellit und Straßenkarte
- „Normal“, „Hybrid“, „Gelände“, „Satellit“ und „Keine“
- Hybrid, Gelände, Satellit, Straßenkarte und „Keine“
- Normal, Gelände, Satellit, Imagemap und „none“
Frage 4
Welche Schnittstelle implementieren Sie, um einem POI eine On-Click-Funktion hinzuzufügen?
GoogleMap.OnPoiListenerGoogleMap.OnPoiClickListenerGoogleMap.OnPoiClickGoogleMap.OnPoiClicked
App zur Einstufung einreichen
Anleitung für Prüfer
Prüfen Sie, ob die App die folgenden Funktionen bietet:
- Wenn die App gestartet wird, wird die Google-Karte korrekt angezeigt. Das bedeutet, dass ein API-Schlüssel ordnungsgemäß generiert wurde.
- Nachdem die Google-Karte geladen wurde, wird die Kamera zum Zuhause oder zur Schule des Schülers bewegt. Im Code sollte dieser Schritt in der Callback-Methode
onMapReady (GoogleMap googleMap)erfolgen. - Markierungen werden am Standort der Schule des Schülers und an einem anderen Standort, z. B. dem Zuhause des Schülers, angezeigt.
- Die beiden Markierungen sind angepasst. Die Markierungen haben beispielsweise eine andere Farbe als die Standardfarbe Rot oder es wird ein benutzerdefiniertes Symbol verwendet.
12. Nächstes Codelab
Alle Codelabs im Kurs „Advanced Android Development“ finden Sie auf der Landingpage für Advanced Android Development-Codelabs.