Erste Schritte mit dem Driver SDK für Android

Sie können das Driver SDK verwenden, um die Navigation und das Tracking zu verbessern. App „Reise- und Bestellfortschritt“. Das Driver SDK bietet Updates zu Fahrzeugstandorten und Aufgaben in der On-demand Rides and Deliveries-Lösung „Flotten-Engine“.

Das Driver SDK informiert die Fleet Engine-Dienste und Ihre benutzerdefinierten Dienste Standort und Zustand des Fahrzeugs. Beispiel: ONLINE oder OFFLINE und der Fahrzeugstandort ändert sich im Laufe der Fahrt.

Mindestsystemanforderungen

Auf dem Mobilgerät muss Android 6.0 installiert sein. (API-Level 23) oder höher.

Build- und Abhängigkeiten-Konfiguration

Die Treiber-SDK-Versionen 4.99 und höher sind im Google Maven-Repository verfügbar.

Gradle

Fügen Sie der Datei build.gradle Folgendes hinzu:

repositories {
    ...
    google()
}

Maven

Fügen Sie der Datei pom.xml Folgendes hinzu:

<project>
  ...
  <repositories>
    <repository>
      <id>google-maven-repository</id>
      <url>https://maven.google.com</url>
    </repository>
  </repositories>
  ...
</project>

Projektkonfiguration

Damit Sie das Driver SDK verwenden können, muss Ihre App auf Folgendes ausgerichtet sein: minSdkVersion 23 oder höher.

Um eine App auszuführen, die mit dem Driver SDK erstellt wurde, muss ein Google Play-Dienste installiert haben.

Entwicklungsprojekt einrichten

So richten Sie Ihr Entwicklungsprojekt ein und rufen einen API-Schlüssel ab für das Projekt in der Google Cloud Console:

  1. Erstellen Sie ein neues Google Cloud Console-Projekt oder wählen Sie ein vorhandenes Projekt aus. mit dem Treiber-SDK. Warten Sie ein paar Minuten, bis Das neue Projekt ist in der Google Cloud Console sichtbar.

  2. Zum Ausführen der Demo-App muss Ihr Projekt Zugriff auf das Maps SDK haben für Android. Wählen Sie in der Google Cloud Console APIs und Dienste > Bibliothek. Suchen Sie dann nach dem Maps SDK und aktivieren Sie es für Android

  3. Rufen Sie einen API-Schlüssel für das Projekt ab, indem Sie APIs und Dienste > Anmeldedaten > Anmeldedaten erstellen > API-Schlüssel. Weitere Informationen zum Abrufen eines API-Schlüssels finden Sie unter Fordern Sie einen API-Schlüssel an.

Treiber-SDK zur App hinzufügen

Das Treiber-SDK ist im Google Maven-Repository verfügbar. Die enthält das Project Object Model (.pom) des SDK und Javadocs. So fügen Sie Ihrer App das Driver SDK hinzu:

  1. Fügen Sie Ihrer Gradle- oder Maven-Konfiguration die folgende Abhängigkeit hinzu. Ersetzen Sie dabei den Parameter VERSION_NUMBER-Platzhalter für die gewünschte Version des Treiber-SDK.

    Gradle

    Fügen Sie zum build.gradle Folgendes hinzu:

    dependencies {
      ...
      implementation 'com.google.android.libraries.mapsplatform.transportation:transportation-driver:VERSION_NUMBER'
    }
    

    Maven

    Fügen Sie zum pom.xml Folgendes hinzu:

    <dependencies>
      ...
      <dependency>
        <groupId>com.google.android.libraries.mapsplatform.transportation</groupId>
        <artifactId>transportation-driver</artifactId>
        <version>VERSION_NUMBER</version>
      </dependency>
    </dependencies>
    
  2. Das Treiber-SDK hängt vom Navigation SDK ab. Diese Abhängigkeit wird so konfiguriert, eine spezielle Version des Navigation SDK explizit in der Build-Konfigurationsdatei definiert werden: Wenn der erwähnte Codeblock ausgelassen wird, kann das Projekt immer die neueste Version des Navigation SDK innerhalb der Hauptversion. Beachten Sie, dass die aktuellen Versionen des Driver SDK und Das Navigation SDK wurde vor der Veröffentlichung strengen Tests unterzogen.

    Abhängigkeitskonfiguration der Entwicklung und des Release anordnen Umgebungen entsprechend angepasst werden.

    Gradle

    Fügen Sie zum build.gradle Folgendes hinzu:

    dependencies {
      ...
      implementation 'com.google.android.libraries.navigation:navigation:5.0.0'
    }
    

    Maven

    Fügen Sie zum pom.xml Folgendes hinzu:

    <dependencies>
      ...
      <dependency>
        <groupId>com.google.android.libraries.navigation</groupId>
        <artifactId>navigation</artifactId>
        <version>5.0.0</version>
      </dependency>
    </dependencies>
    

API-Schlüssel in die App einfügen

Fügen Sie Ihrer App den API-Schlüssel hinzu, nachdem Sie das Driver SDK hinzugefügt haben. Ich müssen Sie den API-Schlüssel des Projekts verwenden, den Sie bei der ein Entwicklungsprojekt eingerichtet.

In diesem Abschnitt wird beschrieben, wie Sie Ihren API-Schlüssel speichern, um sicherer zu werden. auf den in Ihrer App verwiesen wird. Sie sollten Ihren API-Schlüssel nicht in Ihre Version einchecken zu steuern. Sie sollte in der Datei local.properties gespeichert werden, im Stammverzeichnis Ihres Projekts. Weitere Informationen zur local.properties-Datei, siehe Gradle-Attributdateien.

Sie können das Secrets Gradle Plugin for Android verwenden, um diese Aufgabe zu optimieren.

So installieren Sie das Plug-in und speichern Ihren API-Schlüssel:

  1. Öffnen Sie die Datei build.gradle auf Stammebene und fügen Sie folgenden Code in das dependencies-Element unter buildscript.

    Groovy

    buildscript {
        dependencies {
            // ...
            classpath "com.google.android.libraries.mapsplatform.secrets-gradle-plugin:secrets-gradle-plugin:2.0.0"
        }
    }
    

    Kotlin

    buildscript {
        dependencies {
            // ...
            classpath("com.google.android.libraries.mapsplatform.secrets-gradle-plugin:secrets-gradle-plugin:2.0.0")
        }
    }
    
  2. Öffnen Sie die Datei build.gradle auf App-Ebene und fügen Sie folgenden Code in den plugins-Element.

    Groovy

    id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
    

    Kotlin

    id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin")
    
  3. Wenn Sie Android Studio verwenden, Ihr Projekt mit Gradle synchronisieren.

  4. Öffnen Sie die Datei local.properties in Ihrem Verzeichnis auf Projektebene und fügen Sie den folgenden Code. Ersetzen Sie dabei YOUR_API_KEY durch Ihren eigenen API-Schlüssel.

    MAPS_API_KEY=YOUR_API_KEY
    
  5. Gehen Sie in der Datei AndroidManifest.xml zu com.google.android.geo.API_KEY und aktualisieren Sie das Attribut android:value so:

    <meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="${MAPS_API_KEY}" />
    

Das folgende Beispiel zeigt ein vollständiges Manifest für eine Beispiel-App:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.driverapidemo">
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/_AppTheme">

        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="${MAPS_API_KEY}" />

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Fügen Sie Ihrer App die erforderlichen Quellenangaben hinzu.

Wenn Sie das Driver SDK in Ihrer App verwenden, müssen Sie Attributionstext und Open-Source-Lizenzen als Teil der rechtlichen Hinweise Ihrer App . Die Quellenangaben sollten am besten als eigenständiges Menüelement im Menüpunkt Info.

Die Lizenzinformationen finden Sie in der Datei "third_party_Licenses.txt". Datei in nicht mehr archivierte AAR-Dateien.

Weitere Informationen finden Sie unter https://developers.google.com/android/guides/opensource. zur Einbindung von Open-Source-Hinweisen.

Abhängigkeiten

Wenn Sie ProGuard für Folgendes verwenden: um Ihre Builds zu optimieren, müssen Sie Ihrem ProGuard Konfigurationsdatei:

-dontwarn com.google.**
-dontwarn okio.**

Das Mindest-API-Level, das unterstützt wird, ist 23.

SDK initialisieren

Eine Anbieter-ID (normalerweise die Google Cloud-Projekt-ID) ist erforderlich, um Initialisieren Sie das DriverContext-Objekt. Weitere Informationen zum Einrichten der Google Cloud-Projekt, siehe Authentifizierung und Autorisierung.

Bevor Sie das Treiber-SDK verwenden können, müssen Sie es initialisieren das Navigation SDK. So initialisieren Sie das SDK:

  1. Rufen Sie ein Navigator-Objekt aus NavigationApi ab.

    Java

    NavigationApi.getNavigator(
        this, // Activity
        new NavigationApi.NavigatorListener() {
          @Override
          public void onNavigatorReady(Navigator navigator) {
            // Keep a reference to the Navigator (used to configure and start nav)
            this.navigator = navigator;
          }
        }
    );
    

    Kotlin

    NavigationApi.getNavigator(
      this, // Activity
      object : NavigatorListener() {
        override fun onNavigatorReady(navigator: Navigator) {
          // Keep a reference to the Navigator (used to configure and start nav)
          this@myActivity.navigator = navigator
        }
      },
    )
    
  2. Erstellen Sie ein DriverContext-Objekt und füllen Sie die Pflichtfelder aus.

    Java

    DriverContext driverContext = DriverContext.builder(application)
        .setProviderId(providerId)
        .setVehicleId(vehicleId)
        .setAuthTokenFactory(authTokenFactory)
        .setNavigator(navigator)
        .setRoadSnappedLocationProvider(
            NavigationApi.getRoadSnappedLocationProvider(application))
        .build();
    

    Kotlin

    val driverContext =
      DriverContext.builder(application)
        .setProviderId(providerId)
        .setVehicleId(vehicleId)
        .setAuthTokenFactory(authTokenFactory)
        .setNavigator(navigator)
        .setRoadSnappedLocationProvider(NavigationApi.getRoadSnappedLocationProvider(application))
        .build()
    
  3. Verwenden Sie das DriverContext-Objekt, um *DriverApi zu initialisieren.

    Java

    RidesharingDriverApi ridesharingDriverApi = RidesharingDriverApi.createInstance(driverContext);
    

    Kotlin

    val ridesharingDriverApi = RidesharingDriverApi.createInstance(driverContext)
    
  4. Rufen Sie die RidesharingVehicleReporter aus dem API-Objekt ab. (*VehicleReporter erweitert NavigationVehicleReporter.)

    Java

    RidesharingVehicleReporter vehicleReporter = ridesharingDriverApi.getRidesharingVehicleReporter();
    

    Kotlin

    val vehicleReporter = ridesharingDriverApi.getRidesharingVehicleReporter()
    

Mit AuthTokenFactory authentifizieren

Wenn das Driver SDK Standortaktualisierungen generiert, muss er diese Aktualisierungen an Fleet Engine-Server. Um diese Anfragen zu authentifizieren, muss der Parameter Das Treiber-SDK sendet einen Aufruf an einen vom Anrufer bereitgestellten Instanz von AuthTokenFactory. Die Factory ist für das Generieren von Authentifizierungstokens am Standort verantwortlich Aktualisierungszeit.

Wie genau Token generiert werden, hängt von der Situation des jeweiligen Entwicklers ab. Die Implementierung muss jedoch in der Regel folgende Anforderungen erfüllen:

  • Authentifizierungstoken, möglicherweise im JSON-Format, von einem HTTPS-Server abrufen
  • Token analysieren und im Cache speichern
  • Aktualisieren Sie das Token, wenn es abläuft.

Weitere Informationen zu den vom Fleet Engine-Server erwarteten Tokens finden Sie unter JSON Web Token (JWT) zur Autorisierung erstellen:

Hier ist die grundlegende Implementierung einer AuthTokenFactory:

Java

class JsonAuthTokenFactory implements AuthTokenFactory {
  private String token;  // initially null
  private long expiryTimeMs = 0;

  // This method is called on a thread whose only responsibility is to send
  // location updates. Blocking is OK, but just know that no location updates
  // can occur until this method returns.
  @Override
  public String getToken(AuthTokenContext authTokenContext) {
    if (System.currentTimeMillis() > expiryTimeMs) {
      // The token has expired, go get a new one.
      fetchNewToken(authTokenContext.getVehicleId());
    }
    return token;
  }

  private void fetchNewToken(String vehicleId) {
    String url =
        new Uri.Builder()
            .scheme("https")
            .authority("yourauthserver.example")
            .appendPath("token")
            .appendQueryParameter("vehicleId", vehicleId)
            .build()
            .toString();

    try (Reader r = new InputStreamReader(new URL(url).openStream())) {
      com.google.gson.JsonObject obj
          = com.google.gson.JsonParser.parseReader(r).getAsJsonObject();
      token = obj.get("Token").getAsString();
      expiryTimeMs = obj.get("TokenExpiryMs").getAsLong();

      // The expiry time could be an hour from now, but just to try and avoid
      // passing expired tokens, we subtract 10 minutes from that time.
      expiryTimeMs -= 10 * 60 * 1000;
    } catch (IOException e) {
      // It's OK to throw exceptions here. The StatusListener you passed to
      // create the DriverContext class will be notified and passed along the failed
      // update warning.
      throw new RuntimeException("Could not get auth token", e);
    }
  }
}

Kotlin

class JsonAuthTokenFactory : AuthTokenFactory() {

  private var token: String = ""
  private var expiryTimeMs: Long = 0

  // This method is called on a thread whose only responsibility is to send
  // location updates. Blocking is OK, but just know that no location updates
  // can occur until this method returns.
  override fun getToken(context: AuthTokenContext): String {
    if (System.currentTimeMillis() > expiryTimeMs) {
      // The token has expired, go get a new one.
      fetchNewToken(authTokenContext.getVehicleId())
    }
     return token
  }

  fun fetchNewToken(vehicleId: String) {
    val url =
      Uri.Builder()
        .scheme("https")
        .authority("yourauthserver.example")
        .appendPath("token")
        .appendQueryParameter("vehicleId", vehicleId)
        .build()
        .toString()

    try {
      val reader = InputStreamReader(URL(url).openStream())

      reader.use {
        val obj = com.google.gson.JsonParser.parseReader(r).getAsJsonObject()

        token = obj.get("ServiceToken").getAsString()
        expiryTimeMs = obj.get("TokenExpiryMs").getAsLong()

        // The expiry time could be an hour from now, but just to try and avoid
        // passing expired tokens, we subtract 10 minutes from that time.
        expiryTimeMs -= 10 * 60 * 1000
      }
    } catch (e: IOException) {
      // It's OK to throw exceptions here. The StatusListener you passed to
      // create the DriverContext class will be notified and passed along the failed
      // update warning.
      throw RuntimeException("Could not get auth token", e)
    }
  }
}

Diese spezielle Implementierung verwendet den integrierten Java-HTTP-Client, um eine Token im JSON-Format vom Authentifizierungsserver des Entwicklers. Das Token ist werden zur Wiederverwendung gespeichert. Das Token wird noch einmal abgerufen, wenn das alte Token innerhalb von 10 Minuten verfügbar ist. ihrer Ablaufzeit zu ändern.

Ihre Implementierung kann andere Dinge bewirken, z. B. durch die Verwendung eines Hintergrundthreads. um Tokens zu aktualisieren.

Ausnahmen in AuthTokenFactory werden als vorübergehend eingestuft, sofern sie nicht auftreten wiederholt. Nach mehreren Versuchen zeigt das Driver SDK gehen wir davon aus, dass das ist dauerhaft und versucht nicht mehr, Updates zu senden.

Status- und Error Reporting mit StatusListener

Da das Treiber-SDK Aktionen im Hintergrund verwenden, verwenden Sie StatusListener, um Benachrichtigungen auszulösen, wie Fehler, Warnungen oder Debug-Meldungen auftreten. Fehler können sein vorübergehender Natur sein (z. B. BACKEND_CONNECTIVITY_ERROR) oder sie können werden Standortupdates dauerhaft beendet (z. B. VEHICLE_NOT_FOUND, deutet auf einen Konfigurationsfehler hin.

Sie stellen eine optionale StatusListener-Implementierung wie die folgende bereit:

Java

class MyStatusListener implements StatusListener {
  /** Called when background status is updated, during actions such as location reporting. */
  @Override
  public void updateStatus(
      StatusLevel statusLevel, StatusCode statusCode, String statusMsg) {
    // Status handling stuff goes here.
    // StatusLevel may be DEBUG, INFO, WARNING, or ERROR.
    // StatusCode may be DEFAULT, UNKNOWN_ERROR, VEHICLE_NOT_FOUND,
    // BACKEND_CONNECTIVITY_ERROR, or PERMISSION_DENIED.
  }
}

Kotlin

class MyStatusListener : StatusListener() {
  /** Called when background status is updated, during actions such as location reporting. */
  override fun updateStatus(statusLevel: StatusLevel, statusCode: StatusCode, statusMsg: String) {
    // Status handling stuff goes here.
    // StatusLevel may be DEBUG, INFO, WARNING, or ERROR.
    // StatusCode may be DEFAULT, UNKNOWN_ERROR, VEHICLE_NOT_FOUND,
    // BACKEND_CONNECTIVITY_ERROR, or PERMISSION_DENIED.
  }
}

Hinweise zu SSL/TLS

Intern nutzt die Driver SDK-Implementierung SSL/TLS für sichere Kommunikation mit dem Fleet Engine-Server. Ältere Android-Versionen (API-Version 19 oder ist möglicherweise ein SecurityProvider-Patch erforderlich, um mit dem Server. Sie sollten diese Artikel finden Sie weitere Informationen zur Verwendung von SSL unter Android. Der Artikel enthält Codebeispiele zum Patchen des Sicherheitsanbieters.

Standortaktualisierungen aktivieren

Sobald Sie eine *VehicleReporter-Instanz haben, ist das Aktivieren von Standortupdates unkompliziert:

Java

RidesharingVehicleReporter reporter = ...;

reporter.enableLocationTracking();

Kotlin

val reporter = ...

reporter.enableLocationTracking()

Standortaktualisierungen werden in regelmäßigen Abständen gesendet, wenn der Fahrzeugstatus ONLINE Beachten Sie, dass das Aufrufen von reporter.enableLocationTracking() Fahrzeugstatus automatisch auf ONLINE. Du musst Fahrzeugstatus explizit festlegen.

Standardmäßig beträgt das Berichtsintervall 10 Sekunden. Das Berichtsintervall kann mit reporter.setLocationReportingInterval(long, TimeUnit) geändert werden. Die Das unterstützte Mindestaktualisierungsintervall beträgt mindestens 5 Sekunden. Häufigere Updates können zu langsameren Anfragen und Fehlern führen.

Standortupdates deaktivieren

Wenn die Schicht des Fahrers beendet ist, können die Standortaktualisierungen angehalten und der Fahrzeug wurde durch Anruf als offline markiert DeliveryVehicleReporter.disableLocationTracking oder RidesharingVehicleReporter.disableLocationTracking.

Durch diesen Aufruf wird eine endgültige Aktualisierung für die sofortige Zustellung geplant. gibt an, dass das Fahrzeug offline ist. Dieses Update enthält nicht die Standort.

Fahrzeugstatus festlegen

Wenn Standortupdates aktiviert sind und der Fahrzeugstatus auf ONLINE festgelegt wird, das Fahrzeug für SearchVehicles-Anfragen verfügbar machen; das Kennzeichnen eines OFFLINE wird das Fahrzeug als nicht verfügbar markiert.

Sie können den Fahrzeugstatus serverseitig festlegen (siehe Update ein Fahrzeug) oder direkt im Driver SDK:

Java

RidesharingVehicleReporter reporter = ...;

reporter.enableLocationTracking();
reporter.setVehicleState(VehicleState.ONLINE);

Kotlin

val reporter = ...

reporter.enableLocationTracking()
reporter.setVehicleState(VehicleState.ONLINE)

Wenn Standortaktualisierungen aktiviert sind, wird ein Aufruf von setVehicleState ausgelöst bei zum nächsten Standortupdate.

Wenn die Standortermittlung nicht aktiviert ist, wird ein Fahrzeug als ONLINE gekennzeichnet in einem IllegalStateException. Ein Fahrzeug kann als OFFLINE gekennzeichnet werden, wenn Standort-Tracking ist entweder noch nicht aktiviert oder explizit deaktiviert. Daraus ergibt sich: in einem sofortigen Update verfügbar. Ein Aufruf an RidesharingVehicleReporter.disableLocationTracking() wird Fahrzeugstatus auf OFFLINE setzen

setVehicleState wird sofort zurückgegeben und die Aktualisierungen werden am Thread zum Aktualisieren des Standorts. Ähnlich wie bei der Fehlerbehandlung bei Standortaktualisierungen Updates des Fahrzeugstatus mithilfe der optional bereitgestellten StatusListener wurde in DriverContext festgelegt.