Einfache Android-Navigations-App mit dem Google Maps Platform Navigation SDK erstellen

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.

b6c535afde7abd20.png

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.

Das Drop-down-Menü zur Projektauswahl in der Google Cloud Console.

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.

Der Bildschirm „API-Bibliothek“ in der Google Cloud Console mit der Seite „Navigation SDK“.

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.

  1. Klicken Sie im Dialogfeld „Welcome to Android Studio“ (Willkommen in Android Studio) auf die Schaltfläche „Open“ (Öffnen).
  2. Rufen Sie den Ordner auf, in dem Sie das geklonte Repository gespeichert haben, und wählen Sie den Ordner Starter im Ordner codelab-navigation-101-android-kotlin der obersten Ebene aus.
  3. 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:

668332736b67dc82.png

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.

  1. Öffnen Sie die Datei und wechseln Sie zur Codeansicht.
  2. Ersetzen Sie den gesamten Inhalt der Datei durch ein neues Layout eines NavigationView in einem RelativeLayout, wie im Beispiel unten. Da Sie der App nur eine Navigationsansicht hinzufügen, reicht ein einfaches Layout aus.
  3. 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:

  1. Deklarieren Sie eine Variable in Ihrer MainActivity-Klasse, um auf Ihre NavigationView zu verweisen:
private lateinit var navView: NavigationView
  1. Fügen Sie der onCreate()-Methode Code hinzu, um eine Referenz auf Ihre NavigationView abzurufen:
navView = findViewById(R.id.navigation_view)
navView.onCreate(savedInstanceState)
  1. 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)
  1. Bearbeiten Sie den Code, mit dem ViewCompat.setOnApplyWindowInsetsListener aufgerufen wird, sodass auf die ID Ihres NavigationView verwiesen 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
}
  1. 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:

  1. Deklarieren Sie in der Klasse MainActivity zwei Variablen, um auf Event-Listener-Objekte zu verweisen:
private var arrivalListener: Navigator.ArrivalListener? = null
private var routeChangedListener: Navigator.RouteChangedListener? = null
  1. Fügen Sie eine registerNavigationListeners()-Methode hinzu, um die Listener einzurichten, wenn der Navigator initialisiert wird. Mit dieser Methode wird Navigator.clearDestinations() aufgerufen, um NavigationView zurü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)
   }
}
  1. Fügen Sie im initializeNavigationApi-Callback-Code in der initializeNavigationApi-Methode einen Aufruf von registerNavigationListeners() hinzu:onNavigatorReady
override fun onNavigatorReady(navigator: Navigator) {
   // store a reference to the Navigator object
   mNavigator = navigator

   //listen for events en route
   registerNavigationListeners()


}
  1. 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 setTaskRemovedBehaviour des in onNavigatorReady zurückgegebenen navigator-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)
  1. Fügen Sie einen Aufruf von GoogleMap.followMyLocation hinzu, um eine CameraPerspective anzugeben. Auf GoogleMap wird über die Methode NavigatorView.getMapAsync() zugegriffen:
navView.getMapAsync {
   googleMap  ->
   googleMap.followMyLocation(GoogleMap.CameraPerspective.TILTED)
}
  1. 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:

  1. Fügen Sie eine neue navigateToPlace()-Methode hinzu, mit der das Navigationsziel festgelegt wird und die einen placeId-Parameter akzeptiert.
/**
* Requests directions from the user's current location to a specific place (provided by the
* Place ID).
*/
private fun navigateToPlace(placeId: String) {

}
  1. Verwenden Sie in der Methode navigateToPlace() die Methode Waypoint.builder(), um ein Waypoint aus der an die Methode übergebenen Orts-ID zu erstellen. Behandeln Sie die UnsupportedPlaceIdException, 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
}
  1. 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.

  1. 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.
  1. 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.

  1. 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)
}
  1. Fügen Sie in der Methode initializeNavigationApi einen Aufruf Ihrer Methode navigateToPlace() über den onNavigatorReady-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.

93aa433000a14dfc.png

Das Dialogfeld mit den Nutzungsbedingungen für Endnutzer des Navigation SDK.

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.

Die Kartenansicht der Navigations-App mit dem Google-Büro in Mountain View, Kalifornien.

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.

Das Dialogfeld „Erweiterte Steuerelemente“ im Android Device Manager mit einer Ortsauswahl und einer Karte, die auf Bondi Beach in Australien zentriert ist.

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.

Screenshot der Navigations-App mit einer Wegbeschreibung zum Zielort

11. Glückwunsch!

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

55812f33256c0596.png

12. Weitere Schritte

Wenn Sie Ihre App-Entwicklung weiter vorantreiben möchten, finden Sie in den folgenden Themen Inspiration.