1. Hinweis
In diesem Codelab erfahren Sie, wie Sie eine einfache Android-App erstellen, die das Google Maps Platform Navigation SDK verwendet, um zu einem vorkonfigurierten Ziel zu navigieren.
So sieht Ihre App aus, wenn Sie fertig sind.

Voraussetzungen
- Grundkenntnisse in der Android-App-Entwicklung mit Kotlin
- Sie sollten mit den grundlegenden Konzepten des Google Maps SDK vertraut sein, z. B. Karten, Standorte und Koordinaten.
Lerninhalte
- So erstellen Sie eine einfache Android-App, die das Navigation SDK verwendet, um zu einem Ziel zu navigieren.
- Navigation SDK über das Remote-Google-Maven-Repository einbinden
- Standortberechtigungen und Nutzervereinbarung mit den Endnutzerbedingungen des Navigation SDK verwalten
- SDK initialisieren
- So legen Sie ein Ziel fest und starten die Navigation.
Voraussetzungen
- Die aktuelle stabile Version von Android Studio ist installiert. Dieses Codelab wurde mit Android Studio Jellyfish erstellt. Wenn Sie eine andere Version verwenden, können sich das Erscheinungsbild und das Layout der Benutzeroberfläche und der Komponenten unterscheiden.
- Ein Google-Konto und ein Projekt mit aktivierter Abrechnung.
- Ein Android-Gerät im Entwicklermodus mit aktiviertem USB-Debugging oder ein Android-Emulator. Die gewählte Version muss den Mindestanforderungen für das Navigation SDK entsprechen.
2. Einrichten
Wenn Sie noch kein Google Cloud-Konto und kein Projekt mit aktivierter Abrechnung haben, richten Sie Ihr Google Cloud-Projekt gemäß der Anleitung unter https://developers.google.com/maps/gmp-get-started.
Wählen Sie in der Console Ihr Google Cloud-Projekt aus.
Klicken Sie in der Cloud Console auf das Drop-down-Menü für das Projekt und wählen Sie das Projekt aus, das Sie für dieses Codelab verwenden möchten.

Navigation SDK in Ihrem Projekt aktivieren
Aktivieren Sie die für dieses Codelab erforderlichen APIs und SDKs der Google Maps Platform im Google Cloud Marketplace.
Rufen Sie in der Google Cloud Console „APIs & Dienste > Bibliothek“ auf und suchen Sie nach „Navigation SDK“.
Sie sollten ein Suchergebnis sehen.

Klicken Sie auf das Navigation SDK-Ergebnis, um die Seite mit den Produktdetails zu öffnen. Klicken Sie auf die Schaltfläche „Aktivieren“, um das SDK für Ihr Projekt zu aktivieren.
Wiederholen Sie diesen Vorgang für das Google Maps SDK for Android.
API-Schlüssel erstellen
Generieren Sie einen API-Schlüssel in der Cloud Console auf der Seite Anmeldedaten. Folgen Sie dazu den Schritten 3 im Abschnitt „Kurzanleitung“ unter Erste Schritte mit der Google Maps Platform. Für alle Anfragen an die Google Maps Platform ist ein API-Schlüssel erforderlich.
3. Beispielprojektdateien abrufen
In diesem Abschnitt wird beschrieben, wie Sie ein einfaches leeres Android Studio-Projekt einrichten, indem Sie Dateien aus dem GitHub-Repository für dieses Codelab klonen. Das GitHub-Repository enthält Vorher- und Nachher-Versionen des Codelab-Codes. Das Codelab beginnt mit einer leeren Projektvorlage und wird bis zum fertigen Zustand aufgebaut. Sie können das fertige Projekt im Repository als Referenz verwenden, wenn Sie nicht weiterkommen.
Klonen Sie dieses GitHub-Repository, um den Code für dieses Codelab zu erhalten.
git clone https://github.com/googlemaps-samples/codelab-navigation-101-android-kotlin.git
Wenn Sie Git nicht installiert haben, klicken Sie auf diese Schaltfläche, um den Code zu erhalten:
Damit Sie so schnell wie möglich loslegen können, enthält das Repository im Ordner Starter Startcode, der Ihnen hilft, diesem Codelab zu folgen. Das Starter-Projekt bietet eine grundlegende App-Benutzeroberfläche und Build-Konfiguration, enthält aber kein Navigation SDK. Es gibt auch ein fertiges Solution-Projekt, falls Sie voranspringen oder Ihren Fortschritt jederzeit überprüfen möchten.
Geklontes Repository in Android Studio öffnen
Nachdem Sie das Repository lokal geklont haben, öffnen Sie den Ordner Starter in Android Studio als vorhandenes Projekt.
- Klicken Sie im Dialogfeld „Welcome to Android Studio“ (Willkommen in Android Studio) auf die Schaltfläche „Open“ (Öffnen).
- Rufen Sie den Ordner auf, in dem Sie das geklonte Repository gespeichert haben, und wählen Sie den Ordner
Starterim Ordnercodelab-navigation-101-android-kotlinder obersten Ebene aus. - Prüfen Sie, ob das Projekt erstellt und ausgeführt wird.
Virtuelles Gerät hinzufügen oder Hardwaregerät verbinden
Wenn Sie ein Android-Gerät mit Ihrem Computer verbinden möchten, folgen Sie der Anleitung zum Ausführen von Apps auf einem Hardwaregerät in Android Studio. Alternativ können Sie ein virtuelles Gerät mit dem AVD Manager für virtuelle Android-Geräte konfigurieren. Beim Auswählen eines Emulators sollten Sie ein Image angeben, das die Google-APIs enthält.
Klicken Sie in Android Studio auf die Menüoption „Run“ oder das Wiedergabesymbol. Wählen Sie ein Gerät aus, wenn Sie dazu aufgefordert werden.
4. Das Navigation SDK in Ihre App einbinden
Navigation SDK-Bibliothek und API-Schlüssel zum Projekt hinzufügen
Wenn Sie die Navigation SDK-Bibliothek in Ihre App einfügen möchten, müssen Sie die build.gradle.kts auf App-Ebene ändern, um das Navigation SDK aus dem Google Maven-Repository abzurufen und eine Versionsnummer zu konfigurieren.
Erstellen Sie in Ihrer Build-Konfiguration eine Variable, in der die Versionsnummer des Navigation SDK gespeichert wird.
Richten Sie in Ihrem build.gradle.kts auf App-Ebene eine Variable ein, die den Wert der in Ihrer App verwendeten Version des Navigation SDK enthält. So können Sie in Zukunft ganz einfach auf die neueste Version umstellen.
Die aktuelle Versionsnummer finden Sie in den Versionshinweisen zum Navigation SDK.
val navSdkVersion by extra("6.0.0")
Sie können die Werte dieser und anderer Variablen auch über das Dialogfeld unter „Datei“ > „Projektstruktur“ > „Variablen“ ändern:

Abhängigkeit zur Build-Konfiguration hinzufügen
Fügen Sie nun dem Block „dependencies“ in Ihrer build.gradle.kts.-Datei auf App-Ebene die folgende API-Abhängigkeit hinzu. Die verwendete Version ist der Wert von ${navSdkVersion}, den Sie gerade in Ihrer build.gradle.kts-Datei auf App-Ebene festgelegt haben:
dependencies {
// Include the Google Navigation SDK.
api("com.google.android.libraries.navigation:navigation:${navSdkVersion}")
...
API-Schlüssel hinzufügen
API-Schlüssel mit dem Secrets Gradle-Plug-in verwalten
Wir empfehlen, das Secrets Gradle-Plug-in zu verwenden, um den API-Schlüssel in Ihrer App sicher zu verwalten. Das Plug-in wurde der ursprünglichen Projektvorlage als Abhängigkeit in der build.gradle.kts-Datei auf oberster Ebene hinzugefügt.
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin") version "2.0.1" apply false
//... other plugin definitions here
}
Öffnen Sie die Datei secrets.properties im Verzeichnis der obersten Ebene und ersetzen Sie YOUR_API_KEY durch Ihren API-Schlüssel. Speichern Sie den Schlüssel in dieser Datei, da secrets.properties nicht in ein Versionsverwaltungssystem eingecheckt werden kann.
MAPS_API_KEY=YOUR_API_KEY
Weitere Informationen zu diesem Thema finden Sie in der Navigation SDK-Dokumentation unter API-Schlüssel zur App hinzufügen.
Inhalt von „local.defaults.properties“ prüfen
Das leere Projekt enthält auch eine local.defaults.properties-Datei im Verzeichnis der obersten Ebene, im selben Ordner wie die secrets.properties-Datei. Öffnen Sie die Datei und sehen Sie sich den folgenden Code an.
MAPS_API_KEY=DEFAULT_API_KEY
Dieser Wert dient als Ersatzwert für die Property MAPS_API_KEY, falls secrets.properties nicht dem Projekt hinzugefügt wird, damit Builds nicht fehlschlagen. Diese Datei muss nicht bearbeitet werden. Wenn die secrets.properties-Definition von MAPS_API_KEY nicht gefunden wird, wird die Ausführung der App zur Laufzeit mit einem API-Schlüsselfehler beendet.
Prüfen, ob im Android-Manifest der von Ihnen angegebene API-Schlüssel verwendet wird
Öffnen Sie app/src/main/AndroidManifest.xml. Sie sehen, dass mit dem Attribut MAPS_API_KEY der API-Schlüssel für die Anwendung festgelegt wird:
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="${MAPS_API_KEY}" />
Öffnen Sie die Datei build.gradle.kts auf App-Ebene und suchen Sie nach dem Attribut secrets.
Die Einstellung propertiesFileName des Plug-ins sollte auf secrets.properties festgelegt sein und defaultPropertiesFileName sollte local.defaults.properties lauten.
secrets {
// Optionally specify a different file name containing your secrets.
// The plugin defaults to "local.properties"
propertiesFileName = "secrets.properties"
// A properties file containing default secret values. This file can be
// checked in version control.
defaultPropertiesFileName = "local.defaults.properties"
}
Speichere alle Dateien und synchronisiere dein Projekt mit Gradle.
5. App-Berechtigungen konfigurieren und eine einfache Benutzeroberfläche hinzufügen
Berechtigung zur Ermittlung des genauen Standorts anfordern
Das Navigation SDK ist auf GPS-Signale angewiesen. Ihre App muss den Nutzer daher um die Erlaubnis bitten, auf genaue Standortdaten zuzugreifen. Fügen Sie die Berechtigung für den Zugriff auf den genauen Standort als untergeordnetes Element des Elements <manifest> in AndroidManifest.xml hinzu.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" >
<uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION"
/>
</manifest>
Weitere Informationen zu Android-Standortberechtigungen finden Sie in der Android-Entwicklerdokumentation im Abschnitt Standortberechtigungen anfordern.
Wenn Sie Ihre App auf einem Gerät mit Android 14 ausführen möchten, fordern Sie die Berechtigung „Standortdienste im Vordergrund“ an, indem Sie das folgende uses-permission-Tag an derselben Stelle wie die Berechtigung für den Zugriff auf den genauen Standort einfügen:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" />
Startaktivität mit einer einfachen Benutzeroberfläche hinzufügen
Wenn Ihre App ausgeführt wird, ist Code erforderlich, der beim Start ausgeführt wird, um zu prüfen, ob der Nutzer die Berechtigung zum Zugriff auf seinen Standort erteilt hat. Außerdem muss jeder mögliche Fall behandelt werden. Wenn die Berechtigung noch nicht erteilt wurde, muss sie angefordert werden. Fügen Sie dazu Ihrer App eine einfache Benutzeroberfläche hinzu. In diesem Codelab wird die Benutzeroberfläche verwendet, die beim Erstellen einer neuen, leeren Views-Aktivität in Android Studio erstellt wird. Sie passen dies an, um die Berechtigung zur Standortermittlung zu prüfen, bevor Sie der Aktivität Code für die Navigations-UI hinzufügen.
Öffnen Sie die Datei MainActivity.kt im Code-Editor und sehen Sie sich den Code an, der eine einfache Benutzeroberfläche zeigt.
Berechtigungen für den Standortzugriff zur Laufzeit anfordern
Ihre App muss die Anfrage für den Zugriff auf den genauen Standort auslösen, bevor das Navigation SDK initialisiert wird.
Damit diese Prüfung beim Start Ihrer App erfolgt, fügen Sie der MainActivity-Klasse in der überschriebenen onCreate()-Methode Ihrer Aktivität Code hinzu.
Mit dem folgenden Code wird überprüft, ob der Nutzer eine gültige Berechtigung zur Standortermittlung erteilt hat. Falls nicht, wird die Berechtigung angefordert. Fügen Sie diesen Code in Ihre onCreate()-Methode ein.
val permissions =
if (VERSION.SDK_INT >= VERSION_CODES.TIRAMISU) {
arrayOf(permission.ACCESS_FINE_LOCATION, permission.POST_NOTIFICATIONS)
} else {
arrayOf(permission.ACCESS_FINE_LOCATION)
}
if (permissions.any { !checkPermissionGranted(it) }) {
if (permissions.any { shouldShowRequestPermissionRationale(it) }) {
// Display a dialogue explaining the required permissions.
}
val permissionsLauncher =
registerForActivityResult(
RequestMultiplePermissions(),
{ permissionResults ->
if (permissionResults.getOrDefault(permission.ACCESS_FINE_LOCATION, false)) {
onLocationPermissionGranted()
} else {
finish()
}
},
)
permissionsLauncher.launch(permissions)
} else {
android.os.Handler(Looper.getMainLooper()).postDelayed({ onLocationPermissionGranted() }, SPLASH_SCREEN_DELAY_MILLIS)
}
}
private fun checkPermissionGranted(permissionToCheck: String): Boolean =
ContextCompat.checkSelfPermission(this, permissionToCheck) == PackageManager.PERMISSION_GRANTED
Fügen Sie Ihrer MainActivity-Klasse eine neue Funktion namens onLocationPermissionGranted hinzu, die das Ergebnis verarbeitet, wenn der Nutzer die Berechtigung zum Teilen seines Standorts erteilt. In den nächsten Schritten fügen wir hier Code hinzu, um eine neue Navigationsaktivität zu starten.
private fun onLocationPermissionGranted() {
//code to initialize Navigation SDK will go here
}
Erstellen Sie Ihr Projekt. Wenn Build-Fehler auftreten, suchen Sie nach ihnen und beheben Sie sie.
Führen Sie Ihr Projekt auf einem neuen virtuellen Gerät aus. Das Dialogfeld für die Berechtigungsanfrage sollte angezeigt werden, wenn die App installiert und gestartet wird.
6. Navigationsbenutzeroberfläche hinzufügen
Es gibt zwei Möglichkeiten, eine Navigations-UI hinzuzufügen: SupportNavigationFragment oder NavigationView.
Der Einfachheit halber wird im Codelab ein NavigationView verwendet.
Layout bearbeiten
Bearbeiten Sie res/layout/activity_main.xml, um ein Layout für eine NavigationView hinzuzufügen.
- Öffnen Sie die Datei und wechseln Sie zur Codeansicht.
- Ersetzen Sie den gesamten Inhalt der Datei durch ein neues Layout eines
NavigationViewin einemRelativeLayout, wie im Beispiel unten. Da Sie der App nur eine Navigationsansicht hinzufügen, reicht ein einfaches Layout aus. - Geben Sie Ihrer NavigationView die ID „
@+id/navigation_view“.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.libraries.navigation.NavigationView
android:id="@+id/navigation_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</RelativeLayout>
Navigationsaktivität einrichten
Öffnen Sie in Android Studio die Datei „MainActivity.kt“ im Editor.
Fügen Sie etwas grundlegenden Einrichtungscode hinzu, damit die Navigation in Ihrer App richtig funktioniert. Nehmen Sie in der Datei „MainActivity.kt“ die folgenden Änderungen vor:
- Deklarieren Sie eine Variable in Ihrer
MainActivity-Klasse, um auf IhreNavigationViewzu verweisen:
private lateinit var navView: NavigationView
- Fügen Sie der
onCreate()-Methode Code hinzu, um eine Referenz auf IhreNavigationViewabzurufen:
navView = findViewById(R.id.navigation_view)
navView.onCreate(savedInstanceState)
- Fügen Sie der Methode
onCreate()Code hinzu, damit der Bildschirm während der Navigationsanleitung eingeschaltet bleibt:
// Ensure the screen stays on during nav.
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
- Bearbeiten Sie den Code, mit dem
ViewCompat.setOnApplyWindowInsetsListeneraufgerufen wird, sodass auf die ID IhresNavigationViewverwiesen wird.
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.navigation_view)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
- Fügen Sie der Klasse eine
showToast()-Methode hinzu, um dem Nutzer Feedback zu geben:
private fun showToast(errorMessage: String) {
Toast.makeText(this@MainActivity, errorMessage, Toast.LENGTH_LONG).show()
}
7. Navigation SDK initialisieren
Nachdem Sie die grundlegende Einrichtung der Navigationsaktivität abgeschlossen haben, können Sie das Navigation SDK initialisieren. Fügen Sie dazu den folgenden Code in die Datei „MainActivity.kt“ ein:
/** Starts the Navigation API, capturing a reference when ready. */
@SuppressLint("MissingPermission")
private fun initializeNavigationApi() {
NavigationApi.getNavigator(
this,
object : NavigatorListener {
override fun onNavigatorReady(navigator: Navigator) {
// store a reference to the Navigator object
mNavigator = navigator
// code to start guidance will go here
}
override fun onError(@NavigationApi.ErrorCode errorCode: Int) {
when (errorCode) {
NavigationApi.ErrorCode.NOT_AUTHORIZED -> {
// Note: If this message is displayed, you may need to check that
// your API_KEY is specified correctly in AndroidManifest.xml
// and is been enabled to access the Navigation API
showToast(
"Error loading Navigation API: Your API key is " +
"invalid or not authorized to use Navigation."
)
}
NavigationApi.ErrorCode.TERMS_NOT_ACCEPTED -> {
showToast(
"Error loading Navigation API: User did not " +
"accept the Navigation Terms of Use."
)
}
else -> showToast("Error loading Navigation API: $errorCode")
}
}
},
)
}
Mit diesem Code wird eine neue Methode namens initializeNavigationApi() erstellt. Diese Methode ruft eine Referenz auf ein Navigator-Objekt ab, indem sie NavigationApi.getNavigator() aufruft, und implementiert ein NavigatorListener, um den Callback zu verarbeiten.
Beachten Sie, dass beim Initialisieren der Navigation API die Methode NavigationListener.onNavigatorReady aufgerufen wird und ein Navigator-Objekt als Parameter übergeben wird. Mit dem obigen Code wird die zuvor deklarierte Variable mNavigator mit dem initialisierten Navigator-Objekt aktualisiert, das an diese Methode übergeben wird.
Fügen Sie schließlich einen Aufruf der initializeNavigationApi-Methode über die onLocationPermissionGranted-Methode hinzu.
private fun onLocationPermissionGranted() {
initializeNavigationApi()
}
8. Listener für wichtige Navigationsereignisse hinzufügen
Wenn Ihre Nutzer der Anleitung folgen, löst das Navigation SDK Ereignisse aus, die die App über wichtige Statusänderungen auf dem Weg informieren, z. B. wenn der Nutzer eine neue Route berechnet oder sein Ziel erreicht. Fügen Sie in der Datei „MainActivity.kt“ Listener hinzu, um diese Ereignisse zu verarbeiten:
- Deklarieren Sie in der Klasse
MainActivityzwei Variablen, um auf Event-Listener-Objekte zu verweisen:
private var arrivalListener: Navigator.ArrivalListener? = null
private var routeChangedListener: Navigator.RouteChangedListener? = null
- Fügen Sie eine
registerNavigationListeners()-Methode hinzu, um die Listener einzurichten, wenn der Navigator initialisiert wird. Mit dieser Methode wirdNavigator.clearDestinations()aufgerufen, umNavigationViewzurückzusetzen, wenn das Ereignis „Ankunft“ ausgelöst wird:
/**
* Registers a number of example event listeners that show an on screen message when certain
* navigation events occur (e.g. the driver's route changes or the destination is reached).
*/
private fun registerNavigationListeners() {
withNavigatorAsync {
arrivalListener =
Navigator.ArrivalListener { // Show an onscreen message
showToast("User has arrived at the destination!")
mNavigator?.clearDestinations()
}
mNavigator?.addArrivalListener(arrivalListener)
routeChangedListener =
Navigator.RouteChangedListener { // Show an onscreen message when the route changes
showToast("onRouteChanged: the driver's route changed")
}
mNavigator?.addRouteChangedListener(routeChangedListener)
}
}
- Fügen Sie im
initializeNavigationApi-Callback-Code in derinitializeNavigationApi-Methode einen Aufruf vonregisterNavigationListeners()hinzu:onNavigatorReady
override fun onNavigatorReady(navigator: Navigator) {
// store a reference to the Navigator object
mNavigator = navigator
//listen for events en route
registerNavigationListeners()
}
- Benutzeroberfläche konfigurieren Sie können verschiedene Aspekte der Navigationsbenutzeroberfläche steuern, während die Routenführung aktiv ist. Eine wichtige Anpassung ist die Kameraposition. Fügen Sie einen Aufruf der Methode
setTaskRemovedBehaviourdes inonNavigatorReadyzurückgegebenennavigator-Objekts wie folgt hinzu. Dadurch werden die Anleitung und Benachrichtigungen beendet, wenn die App geschlossen wird:
// Disables the guidance notifications and shuts down the app and background service
// when the user dismisses/swipes away the app from Android's recent tasks.
navigator.setTaskRemovedBehavior(Navigator.TaskRemovedBehavior.QUIT_SERVICE)
- Fügen Sie einen Aufruf von
GoogleMap.followMyLocationhinzu, um eineCameraPerspectiveanzugeben. AufGoogleMapwird über die MethodeNavigatorView.getMapAsync()zugegriffen:
navView.getMapAsync {
googleMap ->
googleMap.followMyLocation(GoogleMap.CameraPerspective.TILTED)
}
- Damit die Navigation während des gesamten App-Lebenszyklus reibungslos funktioniert, müssen Sie die folgenden Methoden in Ihrer
MainActivity-Klasse implementieren:
override fun onSaveInstanceState(savedInstanceState: Bundle) {
super.onSaveInstanceState(savedInstanceState)
navView.onSaveInstanceState(savedInstanceState)
}
override fun onTrimMemory(level: Int) {
super.onTrimMemory(level)
navView.onTrimMemory(level)
}
override fun onStart() {
super.onStart()
navView.onStart()
}
override fun onResume() {
super.onResume()
navView.onResume()
}
override fun onPause() {
navView.onPause()
super.onPause()
}
override fun onConfigurationChanged(configuration: Configuration) {
super.onConfigurationChanged(configuration)
navView.onConfigurationChanged(configuration)
}
override fun onStop() {
navView.onStop()
super.onStop()
}
override fun onDestroy() {
navView.onDestroy()
withNavigatorAsync {
// Unregister event listeners to avoid memory leaks.
if (arrivalListener != null) {
navigator.removeArrivalListener(arrivalListener)
}
if (routeChangedListener != null) {
navigator.removeRouteChangedListener(routeChangedListener)
}
navigator.simulator?.unsetUserLocation()
navigator.cleanup()
}
super.onDestroy()
}
9. Ziel festlegen
Sie können jetzt ein Ziel festlegen und die Navigation starten. Nehmen Sie in der Datei „MainActivity.kt“ die folgenden Änderungen vor:
- Fügen Sie eine neue
navigateToPlace()-Methode hinzu, mit der das Navigationsziel festgelegt wird und die einenplaceId-Parameter akzeptiert.
/**
* Requests directions from the user's current location to a specific place (provided by the
* Place ID).
*/
private fun navigateToPlace(placeId: String) {
}
- Verwenden Sie in der Methode
navigateToPlace()die MethodeWaypoint.builder(), um einWaypointaus der an die Methode übergebenen Orts-ID zu erstellen. Behandeln Sie dieUnsupportedPlaceIdException, die in Situationen ausgelöst werden kann, in denen die Orts-ID nicht in eine genaue Adresse aufgelöst wird:
val waypoint: Waypoint? =
// Set a destination by using a Place ID (the recommended method)
try {
Waypoint.builder().setPlaceIdString(placeId).build()
} catch (e: Waypoint.UnsupportedPlaceIdException) {
showToast("Place ID was unsupported.")
return
}
- Fügen Sie der
navigateToPlace()-Methode den folgenden Code hinzu, um ein Ziel mit dem Wegpunkt festzulegen:
val pendingRoute = mNavigator?.setDestination(waypoint)
// Set an action to perform when a route is determined to the destination
pendingRoute?.setOnResultListener { code ->
when (code) {
RouteStatus.OK -> {
// Code to start guidance will go here
}
RouteStatus.ROUTE_CANCELED -> showToast("Route guidance canceled.")
RouteStatus.NO_ROUTE_FOUND,
RouteStatus.NETWORK_ERROR ->
// TODO: Add logic to handle when a route could not be determined
showToast("Error starting guidance: $code")
else -> showToast("Error starting guidance: $code")
}
}
Das Navigator-Objekt hat eine setDestinations()-Methode, die verschiedene Parameter akzeptieren kann. Die einfachste Option ist die Angabe eines Waypoint. Die Standardeinstellung ist die Mobilitätsform DRIVING, die für vierrädrige Autos geeignet ist. Die setDestinations()-Methode gibt ein ListenableResultFuture-Objekt mit einem RouteStatus-Objekt zurück. Die RouteStatus gibt an, ob eine Route zum Ziel gefunden wurde. Wenn nicht, können Sie verschiedene Fehlerstatus behandeln.
- Nehmen Sie zusätzliche Konfigurationsänderungen vor, um die Navigation zu verbessern:
// Hide the toolbar to maximize the navigation UI
supportActionBar?.hide()
// Enable voice audio guidance (through the device speaker)
mNavigator?.setAudioGuidance(Navigator.AudioGuidance.VOICE_ALERTS_AND_GUIDANCE)
// Simulate vehicle progress along the route (for demo/debug builds)
if (BuildConfig.DEBUG) {
mNavigator?.simulator?.simulateLocationsAlongExistingRoute(
SimulationOptions().speedMultiplier(5f)
)
}
Diese Änderungen umfassen die folgenden Verbesserungen:
- Die Aktionsleiste wird ausgeblendet, um den Platz für die Navigations-UI zu maximieren.
- Aktivieren von Audioanweisungen, damit Benachrichtigungen und Navigationsanweisungen vorgelesen werden.
- Einrichten des Simulators für das Debugging durch Angabe eines Geschwindigkeitsmultiplikators.
- Suchen Sie eine Orts-ID, die als Ziel dienen soll. Idealerweise sollte der Standort nicht zu weit vom Standort des Nutzers entfernt sein. Verwenden Sie das Google Maps Platform Place ID Finder-Tool oder rufen Sie eine Orts-ID über einen Places API-Aufruf ab.
Wenn Sie die Navigation simulieren, können Sie den Nutzerstandort im Code festlegen oder von Ihrem verbundenen Gerät abrufen. In diesem Codelab wird davon ausgegangen, dass Sie einen Standort in London, Vereinigtes Königreich, simulieren.
- Fügen Sie Ihrer
MainActivity-Klasse ein Companion-Objekt hinzu, um einen Startort und eine Orts-ID zu speichern. Im Codelab wird ein Startort in London und die Orts-ID von Trafalgar Square verwendet:
companion object{
const val TRAFALGAR_SQUARE ="ChIJH-tBOc4EdkgRJ8aJ8P1CUxo" //London, UK
val startLocation = LatLng(51.345678, -0.1234456)
}
- Fügen Sie in der Methode
initializeNavigationApieinen Aufruf Ihrer MethodenavigateToPlace()über denonNavigatorReady-Callback ein und fügen Sie einen Logikzweig hinzu, der im Debug-Modus ausgeführt wird und den Nutzerstandort festlegt:
// Disables the guidance notifications and shuts down the app and background service
// when the user dismisses/swipes away the app from Android's recent tasks.
navigator.setTaskRemovedBehavior(Navigator.TaskRemovedBehavior.QUIT_SERVICE)
mNavigator = navigator
if (BuildConfig.DEBUG) {
mNavigator?.simulator?.setUserLocation(MainActivity.startLocation)
}
//listen for events en route
registerNavigationListeners()
navView.getMapAsync {
googleMap ->
googleMap.followMyLocation(GoogleMap.CameraPerspective.TILTED)
}
//navigate to a destination
navigateToPlace(MainActivity.TRAFALGAR_SQUARE)
10. Code erstellen und ausführen
Wenn Sie die App zum ersten Mal ausführen, müssen Sie ihr die Berechtigung zur Standortermittlung erteilen und den Nutzungsbedingungen des Navigation SDK zustimmen.
Hinweis: Beim Ausführen der App wird die Methode setDestinations() aufgerufen, für die nach den ersten 1.000 verwendeten Zielen eine Gebühr anfällt. Weitere Informationen finden Sie unter Nutzung und Abrechnung.


Standort festlegen
Standardmäßig ist der Standort des emulierten Geräts auf den Google-Campus in Mountain View, Kalifornien, festgelegt, sofern Sie keinen Standort im Code oder im Dialogfeld „Emulator Properties“ (Emulator-Eigenschaften) festgelegt haben.
In diesem Fall kann die App möglicherweise keine Route zur konfigurierten Orts-ID finden (standardmäßig Sydney Opera House, Sydney, Australien). Dies wird durch die Meldung „Keine Route gefunden“ angezeigt, die von Ihrer showToast()-Methode ausgegeben wird.

Startort fest codieren
Wenn Sie im Code einen anderen Standort festlegen möchten, fügen Sie die folgende Zeile in die navigateToPlace()-Methode in MainActivity.kt vor dem Aufruf von mNavigator.startGuidance() ein:
mNavigator?.simulator?.setUserLocation(startLocation)
Emulator an einem Standardstandort Ihrer Wahl starten
Wenn Sie einen anderen Standort im Geräteemulator festlegen möchten, starten Sie den Emulator, falls er noch nicht ausgeführt wird, und klicken Sie auf das Dreipunkt-Menü mit dem Kurzinfo-Text „Erweiterte Steuerelemente“. Das Dialogfeld, das sich öffnet, enthält eine Menüoption für „Standort“.
Wenn Sie beispielsweise die Orts-ID des Opernhauses in Sydney als Ziel verwenden, wählen Sie einen Ort in Sydney, Australien, aus. Suchen Sie beispielsweise nach „Bondi Beach“, wählen Sie einen Vorschlag aus und klicken Sie rechts unten im Dialogfeld auf „Ort speichern“. Sie können auch auf „Punkt speichern“ klicken, um den Ort einer gespeicherten Liste für die spätere Verwendung hinzuzufügen.

Wenn Sie eine andere Orts-ID als Ziel festlegen, wählen Sie einen Standort in der Nähe aus, damit die simulierte Route realistisch und nicht zu lang für eine einfache Fehlersuche ist.
Starten Sie die App neu. Sie sollten jetzt zum Ziel navigieren können.

11. Glückwunsch!
Sie haben dieses Codelab abgeschlossen. Gut gemacht – Sie haben Ihr Ziel erreicht! Viele Grüße :-)

12. Weitere Schritte
Wenn Sie Ihre App-Entwicklung weiter vorantreiben möchten, finden Sie in den folgenden Themen Inspiration.
- Auf weitere Navigationsereignisse warten Fügen Sie Code hinzu, um eine Nachricht anzuzeigen, wenn die Route geändert wird oder der Fahrer ankommt.
- Navigationsoberfläche anpassen
- Wenn Sie eine größere Herausforderung suchen, können Sie ein Places API Place Picker-Steuerelement hinzufügen, damit der Nutzer das Ziel festlegen kann. Hinweis: Die Navigation SDK-Demo-Apps auf GitHub enthalten eine Beispielimplementierung.
- Verhindern Sie potenzielle Probleme beim asynchronen Aufrufen der Objekte „Navigator“ und „GoogleMap“, indem Sie den Ansatz verwenden, der in den Navigation SDK-Demo-Apps auf GitHub verwendet wird. In komplexeren App-Szenarien sind diese Objekte möglicherweise noch nicht initialisiert, wenn Ihr Code ausgeführt wird. Tipp: Sie können die Klasse InitializedNavScope am Ende der Datei „MainActivity.kt“ hinzufügen, um die Implementierung zu beschleunigen.