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:
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.
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
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:
Fügen Sie Ihrer Gradle- oder Maven-Konfiguration die folgende Abhängigkeit hinzu und 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>
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:
Öffnen Sie die Datei
build.gradle
auf Stammebene und fügen Sie folgenden Code in dasdependencies
-Element unterbuildscript
.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") } }
Öffnen Sie die Datei
build.gradle
auf App-Ebene und fügen Sie folgenden Code in denplugins
-Element.Groovy
id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
Kotlin
id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin")
Wenn Sie Android Studio verwenden, Ihr Projekt mit Gradle synchronisieren.
Öffnen Sie die Datei
local.properties
in Ihrem Verzeichnis auf Projektebene und fügen Sie den folgenden Code. Ersetzen Sie dabeiYOUR_API_KEY
durch Ihren eigenen API-Schlüssel.MAPS_API_KEY=YOUR_API_KEY
Gehen Sie in der Datei
AndroidManifest.xml
zucom.google.android.geo.API_KEY
und aktualisieren Sie das Attributandroid: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:
Rufen Sie ein
Navigator
-Objekt ausNavigationApi
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 } }, )
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()
Verwenden Sie das
DriverContext
-Objekt, um*DriverApi
zu initialisieren.Java
RidesharingDriverApi ridesharingDriverApi = RidesharingDriverApi.createInstance(driverContext);
Kotlin
val ridesharingDriverApi = RidesharingDriverApi.createInstance(driverContext)
Rufen Sie die
RidesharingVehicleReporter
aus dem API-Objekt ab. (*VehicleReporter
erweitertNavigationVehicleReporter
.)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. Bei der Implementierung ist jedoch wahrscheinlich Folgendes erforderlich:
- 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.