Sie können das Consumer SDK verwenden, um eine einfache, mit den Backend-Diensten der On-demand Rides and Deliveries-Lösung. Sie können eine Fahrt- und Bestellfortschritts-App, die eine aktive Fahrt anzeigen kann, auf Fahrtaktualisierungen zu reagieren und Fahrtfehler zu beheben.
Da das Consumer SDK eine modulare Architektur hat, können Sie die Teile der API, die Sie für Ihre Anwendung verwenden möchten, und integrieren Sie diese eigenen APIs, Back-End-Diensten von Fleet Engine, und zusätzlich APIs der Google Maps Platform.
Mindestsystemanforderungen
Auf dem Mobilgerät muss Android ausgeführt werden. 6,0 (API-Level 23) oder höher.
Build- und Abhängigkeiten-Konfiguration
Consumer SDK-Versionen 1.99.0 und höher sind mit dem Google Maven verfügbar zu erstellen. Der zuvor verwendete Kanal für das private Repository wurde eingestellt.
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
Um das Consumer SDK for Android zu verwenden, muss deine App
minSdkVersion
23 oder höher.
Um eine App auszuführen, die mit dem Consumer SDK erstellt wurde, enthält das Android- 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 Consumer 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.
Consumer SDK zur App hinzufügen
Das Consumer SDK ist über ein privates Maven-Repository verfügbar. Die enthält das Project Object Model (.pom) des SDK und Javadocs. So fügen Sie Ihrer App das Consumer SDK hinzu:
Richten Sie Ihre Umgebung so ein, dass sie auf das Maven-Repository des Hosts zugreifen kann, wie unter im vorherigen Abschnitt.
Wenn Sie die Konfiguration der zentralen Abhängigkeitsverwaltung in deklariert haben,
settings.gradle
, deaktivieren Sie ihn so:Entfernen Sie den folgenden Codeblock in
settings.gradle
:import org.gradle.api.initialization.resolve.RepositoriesMode dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() } }
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 Consumer SDK.Gradle
Fügen Sie zum
build.gradle
Folgendes hinzu:dependencies { ... implementation 'com.google.android.libraries.mapsplatform.transportation:transportation-consumer:VERSION_NUMBER' }
Maven
Fügen Sie zum
pom.xml
Folgendes hinzu:<dependencies> ... <dependency> <groupId>com.google.android.libraries.mapsplatform.transportation</groupId> <artifactId>transportation-consumer</artifactId> <version>VERSION_NUMBER</version> </dependency> </dependencies>
Das Consumer SDK hängt vom Maps SDK ab. Diese Abhängigkeit wird so konfiguriert, Wenn die Version des Maps SDK nicht explizit definiert ist, wie unten dargestellt, wenn eine neue Version von Maps SDK veröffentlicht wurde, verwendet das Consumer SDK weiterhin die Mindestanforderung unterstützte Maps SDK-Version.
Gradle
Fügen Sie zum
build.gradle
Folgendes hinzu:dependencies { ... implementation 'com.google.android.gms:play-services-maps:18.1.0' }
Maven
Fügen Sie zum
pom.xml
Folgendes hinzu:<dependencies> ... <dependency> <groupId>com.google.android.gms</groupId> <artifactId>play-services-maps</artifactId> <version>18.1.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 Consumer SDK hinzugefügt haben. Sie müssen den Projekt-API-Schlüssel 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.consumerapidemo">
<uses-permission android:name="android.permission.ACCESS_FINE_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 Consumer 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.
SDK-Authentifizierung für Verbraucher
Das Consumer SDK ermöglicht die Authentifizierung mithilfe von JSON Web Tokens. Ein JSON Web Token (JWT) ist ein Zugriffstoken auf JSON-Basis, das eine oder mehr Ansprüche auf einen Dienst erheben. Zum Beispiel könnte ein Server ein Token mit dem Anspruch „als Administrator angemeldet“ und vorzugeben, dass an einen Auftraggebenden. Der Kunde könnte dann mit diesem Token nachweisen, ist er als Administrator angemeldet.
Das Consumer SDK verwendet das von der Anwendung bereitgestellte JSON Web Token für die Kommunikation mit der Fleet Engine. Weitere Informationen finden Sie unter Fleet Engine-Authentifizierung und -Autorisierung.
Das Autorisierungstoken muss die Anforderung tripid:TRIP_ID
im
authorization
-Header, wobei TRIP_ID
die Fahrt-ID ist. Dies verschafft dem Verbraucher
SDK-Zugriff auf Fahrtdetails wie Fahrzeugposition, Route und voraussichtliche Ankunftszeit.
JSON Web Token-Callbacks
Das Consumer SDK registriert einen Callback für ein Autorisierungstoken während der Initialisierung mit der Anwendung. Das SDK ruft die Anwendung auf. um ein Token für alle Netzwerkanfragen abzurufen, die eine Autorisierung erfordern.
Wir empfehlen dringend, die Cache-Autorisierung der Callback-Implementierung
Tokens erstellen und sie nur nach Ablauf der expiry
-Zeit aktualisieren. Tokens sollten
mit einer Ablaufzeit von einer Stunde ausgestellt werden.
Der Rückruf für das Autorisierungstoken gibt an, welches Diensttoken erforderlich ist
für den Dienst TripService
. Außerdem werden die erforderlichen tripId
für den Kontext.
Das folgende Codebeispiel zeigt, wie eine Autorisierung implementiert wird. Callback des Tokens an.
Java
class JsonAuthTokenFactory implements AuthTokenFactory {
private static final String TOKEN_URL =
"https://yourauthserver.example/token";
private static class CachedToken {
String tokenValue;
long expiryTimeMs;
String tripId;
}
private CachedToken token;
/*
* This method is called on a background thread. Blocking is OK. However, be
* aware that no information can be obtained from Fleet Engine until this
* method returns.
*/
@Override
public String getToken(AuthTokenContext context) {
// If there is no existing token or token has expired, go get a new one.
String tripId = context.getTripId();
if (tripId == null) {
throw new RuntimeException("Trip ID is missing from AuthTokenContext");
}
if (token == null || System.currentTimeMillis() > token.expiryTimeMs ||
!tripId.equals(token.tripId)) {
token = fetchNewToken(tripId);
}
return token.tokenValue;
}
private static CachedToken fetchNewToken(String tripId) {
String url = TOKEN_URL + "/" + tripId;
CachedToken token = new CachedToken();
try (Reader r = new InputStreamReader(new URL(url).openStream())) {
com.google.gson.JsonObject obj
= com.google.gson.JsonParser.parseReader(r).getAsJsonObject();
token.tokenValue = obj.get("ServiceToken").getAsString();
token.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 5 minutes from that time.
*/
token.expiryTimeMs -= 5 * 60 * 1000;
} catch (IOException e) {
/*
* It's OK to throw exceptions here. The error listeners will receive the
* error thrown here.
*/
throw new RuntimeException("Could not get auth token", e);
}
token.tripId = tripId;
return token;
}
}
Kotlin
class JsonAuthTokenFactory : AuthTokenFactory() {
private var token: CachedToken? = null
/*
* This method is called on a background thread. Blocking is OK. However, be
* aware that no information can be obtained from Fleet Engine until this
* method returns.
*/
override fun getToken(context: AuthTokenContext): String {
// If there is no existing token or token has expired, go get a new one.
val tripId =
context.getTripId() ?:
throw RuntimeException("Trip ID is missing from AuthTokenContext")
if (token == null || System.currentTimeMillis() > token.expiryTimeMs ||
tripId != token.tripId) {
token = fetchNewToken(tripId)
}
return token.tokenValue
}
class CachedToken(
var tokenValue: String? = "",
var expiryTimeMs: Long = 0,
var tripId: String? = "",
)
private companion object {
const val TOKEN_URL = "https://yourauthserver.example/token"
fun fetchNewToken(tripId: String) {
val url = "$TOKEN_URL/$tripId"
val token = CachedToken()
try {
val reader = InputStreamReader(URL(url).openStream())
reader.use {
val obj = com.google.gson.JsonParser.parseReader(r).getAsJsonObject()
token.tokenValue = obj.get("ServiceToken").getAsString()
token.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 5 minutes from that time.
*/
token.expiryTimeMs -= 5 * 60 * 1000
}
} catch (e: IOException) {
/*
* It's OK to throw exceptions here. The error listeners will receive the
* error thrown here.
*/
throw RuntimeException("Could not get auth token", e)
}
token.tripId = tripId
return token
}
}
}
API initialisieren
Bevor Sie diese Schritte ausführen, wird davon ausgegangen, dass Sie die Funktion die entsprechenden Dienste und das Consumer SDK.
ConsumerApi
-Instanz abrufen
Damit du das Consumer SDK verwenden kannst, muss deine App initialisiert werden.
ConsumerApi
asynchron. Die API ist ein Singleton-Element.
Die Initialisierungsmethode verwendet eine AuthTokenFactory
. In der Fabrik werden neue
Bei Bedarf JWT-Tokens für den Nutzer.
providerId
ist die Projekt-ID Ihres Google Cloud-Projekts. Weitere Informationen finden Sie in der
Fleet Engine-Nutzerhandbuch
finden Sie weitere Informationen
zum Erstellen des Projekts.
Deine App sollte die AuthTokenFactory
implementieren, wie unter
Consumer SDK Authentication (SDK-Authentifizierung für Nutzer).
Java
Task<ConsumerApi> consumerApiTask = ConsumerApi.initialize(
this, "myProviderId", authTokenFactory);
consumerApiTask.addOnSuccessListener(
consumerApi -> this.consumerApi = consumerApi);
Kotlin
val consumerApiTask =
ConsumerApi.initialize(this, "myProviderId", authTokenFactory)
consumerApiTask?.addOnSuccessListener { consumerApi: ConsumerApi ->
this@YourActivity.consumerApi = consumerApi
}
Maps SDK und Karten-Renderer
Consumer SDK 2.x.x unterstützt das Maps SDK for Android 18.1.0 und höher. Tabelle
Im Folgenden finden Sie eine Übersicht über den Standard-Renderer nach Maps SDK-Version und die unterstützten Funktionen.
beider Renderer. Wir empfehlen jedoch, den neuesten Renderer zu verwenden,
um den alten Renderer zu verwenden,
können Sie ihn explizit mit
MapsInitializer.initialize()
Maps SDK-Version | Unterstützt den neuesten Renderer | Unterstützt den alten Renderer | Standard-Renderer |
---|---|---|---|
V18.1.0 und niedriger | Ja | Ja | Alt* |
V18.2.0 | Ja | Ja | Neueste |
* Mit der Einführung des neuen Maps Renderer wird standardmäßig der neueste Renderer verwendet.
Maps SDK als Abhängigkeit hinzufügen
Gradle
Fügen Sie zum build.gradle
Folgendes hinzu:
dependencies {
//...
implementation "com.google.android.gms:play-services-maps:VERSION_NUMBER"
}
Maven
Fügen Sie zum pom.xml
Folgendes hinzu:
<dependencies>
...
<dependency>
<groupId>com.google.android.gms</groupId>
<artifactId>play-services-maps</artifactId>
<version>18.1.0</version>
</dependency>
</dependencies>
Initialisieren Sie das Maps SDK, bevor Sie das Consumer SDK initialisieren
Rufen Sie in Ihrem Application
- oder Start-up-Kurs Activity
MapsInitializer.initialize()
Warten Sie mit der Initialisierung auf das Ergebnis der Renderer-Anfrage
Consumer SDK:
Java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initViews();
MapsInitializer.initialize(getApplicationContext(), Renderer.LATEST,
new OnMapsSdkInitializedCallback() {
@Override
public void onMapsSdkInitialized(Renderer renderer) {
switch (renderer) {
case LATEST:
Log.i("maps_renderer", "LATEST renderer");
break;
case LEGACY:
Log.i("maps_renderer", "LEGACY renderer");
break;
}
initializeConsumerSdk();
}
});
}
Kotlin
fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main)
initViews()
MapsInitializer.initialize(
getApplicationContext(), Renderer.LATEST,
object : OnMapsSdkInitializedCallback() {
fun onMapsSdkInitialized(renderer: Renderer?) {
when (renderer) {
LATEST -> Log.i("maps_renderer", "LATEST renderer")
LEGACY -> Log.i("maps_renderer", "LEGACY renderer")
}
initializeConsumerSdk()
}
})
}
Benutzeroberfläche erstellen
Sie können entweder ConsumerMapFragment
oder
ConsumerMapView
, um die Benutzeroberfläche für Ihr
. Mit ConsumerMapFragment
können Sie
mithilfe eines
Fragment
und ConsumerMapView
ermöglicht die Verwendung eines
View
Mitfahrgelegenheiten
ist die Funktionalität in ConsumerMapView
und
ConsumerMapFragment
, sodass Sie basierend auf den
entweder View
oder
Fragment
ist für Ihre Anwendung besser geeignet.
Unterstützung für API 19 (KitKat) und Vektor-Drawables hinzufügen
Wenn Ihr App-Design Unterstützung für API 19-Geräte (KitKat) und Vektor-Drawables benötigt,
Fügen Sie Ihrer Aktivität den folgenden Code hinzu. Dieser Code bezieht sich auf
AppCompatActivity
zur Verwendung von
Vektor-Drawables im Consumer SDK
Java
// ...
import android.support.v7.app.AppCompatActivity;
// ...
public class ConsumerTestActivity extends AppCompatActivity {
// ...
}
Kotlin
// ...
import android.support.v7.app.AppCompatActivity
// ...
class ConsumerTestActivity : AppCompatActivity() {
// ...
}
Kartenfragment oder -ansicht hinzufügen
Sie erstellen die Karte für die Anzeige der Journey Share entweder in einem Android-Fragment
oder eine Ansicht, die Sie in der XML-Datei für das Anwendungslayout (unter
/res/layout
. Das Fragment (oder die Ansicht) bietet dann Zugriff auf die Journey.
teilen, auf die deine App zugreifen und sie ändern kann. Die Karte enthält auch ein
Handle auf das ConsumerController
-Element, mit dem deine App steuern und
die Reisefreigabe anpassen.
Karte und Controller teilen
Sie definieren die Journey-Sharing-Karte entweder als Fragment (mithilfe
ConsumerMapFragment
) oder als Ansicht (mit ConsumerMapView
) angezeigt werden, wie in den
folgenden Codebeispielen. Die Methode onCreate()
sollte dann
getConsumerGoogleMapAsync(callback)
, die den ConsumerGoogleMap
zurückgibt
asynchron im Callback verwendet. Anschließend verwenden Sie ConsumerGoogleMap
, um sich
und kann bei Bedarf von Ihrer App aktualisiert werden.
ConsumerMapFragment
Sie definieren das Fragment in Ihrer Anwendungslayout-XML-Datei, wie in im folgenden Codebeispiel.
<fragment
xmlns:android="http://schemas.android.com/apk/res/android"
android:name="com.google.android.libraries.mapsplatform.transportation.consumer.view.ConsumerMapFragment"
android:id="@+id/consumer_map_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
Der Aufruf von getConsumerGoogleMapAsync()
sollte aus onCreate()
kommen.
.
Java
public class SampleAppActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// Find the ConsumerMapFragment.
ConsumerMapFragment consumerMapFragment =
(ConsumerMapFragment) fragmentManager.findFragmentById(R.id.consumer_map_fragment);
// Initiate the callback that returns the map.
if (consumerMapFragment != null) {
consumerMapFragment.getConsumerGoogleMapAsync(
new ConsumerMapReadyCallback() {
// The map returned in the callback is used to access the ConsumerController.
@Override
public void onConsumerMapReady(@NonNull ConsumerGoogleMap consumerGoogleMap) {
ConsumerController consumerController = consumerGoogleMap.getConsumerController();
}
});
}
}
}
Kotlin
class SampleAppActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
// Find the ConsumerMapFragment.
val consumerMapFragment =
fragmentManager.findFragmentById(R.id.consumer_map_fragment) as ConsumerMapFragment
consumerMapFragment.getConsumerGoogleMapAsync(
object : ConsumerMapReadyCallback() {
override fun onConsumerMapReady(consumerGoogleMap: ConsumerGoogleMap) {
val consumerController = consumerGoogleMap.getConsumerController()!!
}
}
)
}
}
ConsumerMapView
Die Ansicht kann entweder in einem Fragment oder in einer Aktivität verwendet werden, wie in Ihrem XML-Datei.
<com.google.android.libraries.mapsplatform.transportation.consumer.view.ConsumerMapView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/consumer_map_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
Der Aufruf von getConsumerGoogleMapAsync()
sollte von onCreate()
stammen. In
muss zusätzlich zum Callback-Parameter die beinhaltende Aktivität oder
Fragment und GoogleMapOptions
(die null sein können), die die Konfiguration
Attribute für die MapView
. Die Aktivitäts- oder Fragment-Basisklasse muss entweder
eine FragmentActivity
bzw. eine Support-Fragment
, da sie eine
Zugriff auf ihren Lebenszyklus haben.
Java
public class SampleAppActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
ConsumerMapView mapView = findViewById(R.id.consumer_map_view);
if (mapView != null) {
mapView.getConsumerGoogleMapAsync(
new ConsumerMapReadyCallback() {
// The map returned in the callback is used to access the ConsumerController.
@Override
public void onConsumerMapReady(@NonNull ConsumerGoogleMap consumerGoogleMap) {
ConsumerController consumerController = consumerGoogleMap.getConsumerController();
}
}, this, null);
}
}
}
Kotlin
class SampleAppActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
val mapView = findViewById(R.id.consumer_map_view) as ConsumerMapView
mapView.getConsumerGoogleMapAsync(
object : ConsumerMapReadyCallback() {
// The map returned in the callback is used to access the ConsumerController.
override fun onConsumerMapReady(consumerGoogleMap: ConsumerGoogleMap) {
val consumerController = consumerGoogleMap.getConsumerController()!!
}
},
/* fragmentActivity= */ this,
/* googleMapOptions= */ null,
)
}
}
Ein MapView
in einem Fragment ist dasselbe wie im obigen Beispiel für MapView
in
Aktivität, mit der Ausnahme, dass das Fragment das Layout, das die
MapView
in der onCreateView()
-Methode des Fragments.
Java
public class MapViewInFragment extends Fragment {
@Override
public View onCreateView(
@NonNull LayoutInflater layoutInflater,
@Nullable ViewGroup viewGroup,
@Nullable Bundle bundle) {
return layoutInflater.inflate(R.layout.consumer_map_view, viewGroup, false);
}
}
Kotlin
class MapViewInFragment : Fragment() {
override fun onCreateView(
layoutInflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?,
): View {
return layoutInflater.inflate(R.layout.consumer_map_view, viewGroup, false)
}
}
Den Kamerazoom so anpassen, dass er sich auf eine Reise fokussiert
Mit der standardmäßigen Schaltfläche „Mein Standort“ im Maps SDK wird die Kamera auf den Gerätestandort zentriert.
Wenn gerade eine Sitzung geteilt wird, sollten Sie die Kamera zentrieren um sich auf die Reise und nicht auf den Gerätestandort zu konzentrieren.
Consumer SDK for Android – integrierte Android-Lösung: AutoCamera
Damit Sie sich auf die Reise statt auf den Gerätestandort konzentrieren können, Consumer SDK bietet eine AutoCamera-Funktion, die ist standardmäßig aktiviert. Die Kamera zoomt, um die Route zu fokussieren, zum nächsten Wegpunkt.
Kameraverhalten anpassen
Wenn Sie das Verhalten der Kamera genauer steuern möchten, können Sie sie deaktivieren oder aktivieren. mit ConsumerController.setAutoCameraEnabled()
ConsumerController.getCameraUpdate() gibt zu diesem Zeitpunkt die empfohlenen Kameragrenzen zurück. Sie können diese CameraUpdate
dann als Argument für
GoogleMap.moveCamera() oder GoogleMap.animateCamera().
Mitfahrdienste und Karten abrufen
Damit Sie Mitfahrdienste und Karteninteraktionen in Ihrer App unterstützen können, benötigen Sie Zugriff
an ConsumerGoogleMap
und
ConsumerController
.
ConsumerMapFragment
und
ConsumerMapView
geben beide asynchron zurück
„ConsumerGoogleMap
“ in ConsumerMapReadyCallback
.
ConsumerGoogleMap
Rückgaberecht
ConsumerController
von getConsumerController()
. Ich
kann auf ConsumerGoogleMap
und
ConsumerController
.
Java
private ConsumerGoogleMap consumerGoogleMap;
private ConsumerController consumerController;
private ConsumerMapView consumerMapView;
consumerMapView.getConsumerGoogleMapAsync(
new ConsumerMapReadyCallback() {
@Override
public void onConsumerMapReady(@NonNull ConsumerGoogleMap consumerMap) {
consumerGoogleMap = consumerMap;
consumerController = consumerMap.getConsumerController();
}
},
this, null);
Kotlin
var consumerGoogleMap: ConsumerGoogleMap
var consumerController: ConsumerController
val consumerMapView = findViewById(R.id.consumer_map_view) as ConsumerMapView
consumerMapView.getConsumerGoogleMapAsync(
object : ConsumerMapReadyCallback() {
override fun onConsumerMapReady(consumerMap: ConsumerGoogleMap) {
consumerGoogleMap = consumerMap
consumerController = consumerMap.getConsumerController()
},
/* fragmentActivity= */ this,
/* googleMapOptions= */ null,
}
)
ConsumerGoogleMap
ConsumerGoogleMap
ist eine Wrapper-Klasse für die
Klasse GoogleMap
. Dadurch kann Ihre App
mit der Karte interagieren. Hierzu wird ein API verwendet, das äquivalent zu
GoogleMap
Mit der Consumer Map können Sie
Teilen, um nahtlos mit demselben zugrunde liegenden GoogleMap-Objekt zu interagieren. Beispiel:
GoogleMap
lässt nur eine Callback-Registrierung zu, aber
ConsumerGoogleMap
unterstützt doppelt registrierte Callbacks.
Über diese Callbacks können deine App und deine Mitfahrgelegenheit Callbacks registrieren, die
werden sequenziell aufgerufen.
ConsumerController
ConsumerController
bietet Zugriff auf Mitfahrdienstfunktionen wie
Fahrten überwachen, Fahrtstatus steuern und Orte festlegen.
Teilen der Reise einrichten
Nachdem das Backend einem Nutzer ein Fahrzeug zugeordnet hat, verwenden Sie JourneySharingSession
.
um die Benutzeroberfläche der Journey Sharing zu starten. Beim Teilen von Reisen werden die übereinstimmenden
Standort und Route des Fahrzeugs. Nachdem Sie das SDK in Ihrer App implementiert haben, können Sie
Funktionen zum Überwachen von Fahrten, Überwachen von Updates und Beheben von Fehlern
Bei den folgenden Verfahren wird davon ausgegangen, dass die Back-End-Dienste vorhanden sind und dass Ihre
für die Vermittlung von
Verbrauchern und Fahrzeugen in Betrieb ist.
Listener für ein
TripModel
-Objekt registrieren, um Details zu erhalten etwa die geschätzte Ankunftszeit und die Entfernung die das Fahrzeug vor der Ankunft zurücklegen muss.Java
// Create a TripModel instance for listening to updates to the trip specified by this trip name. String tripName = ...; TripModelManager tripModelManager = consumerApi.getTripModelManager(); TripModel tripModel = tripModelManager.getTripModel(tripName); // Create a JourneySharingSession instance based on the TripModel. JourneySharingSession session = JourneySharingSession.createInstance(tripModel); // Add the JourneySharingSession instance on the map for updating the UI. consumerController.showSession(session); // Register for trip update events. tripModel.registerTripCallback(new TripModelCallback() { @Override public void onTripETAToNextWaypointUpdated( TripInfo tripInfo, @Nullable Long timestampMillis) { // ... } @Override public void onTripActiveRouteRemainingDistanceUpdated( TripInfo tripInfo, @Nullable Integer distanceMeters) { // ... } // ... });
Kotlin
// Create a TripModel instance for listening to updates to the trip specified by this trip name. val tripName = "tripName" val tripModelManager = consumerApi.getTripModelManager() val tripModel = tripModelManager.getTripModel(tripName) // Create a JourneySharingSession instance based on the TripModel. val session = JourneySharingSession.createInstance(tripModel) // Add the JourneySharingSession instance on the map for updating the UI. consumerController.showSession(session) // Register for trip update events. tripModel.registerTripCallback( object : TripModelCallback() { override fun onTripETAToNextWaypointUpdated( tripInfo: TripInfo, timestampMillis: Long?, ) { // ... } override fun onTripActiveRouteRemainingDistanceUpdated( tripInfo: TripInfo, distanceMeters: Int?, ) { // ... } // ... })
Konfiguriere deine Fahrt mit
TripModelOptions
.Java
// Set refresh interval to 2 seconds. TripModelOptions tripOptions = TripModelOptions.builder().setRefreshIntervalMillis(2000).build(); tripModel.setTripModelOptions(tripOptions);
Kotlin
// Set refresh interval to 2 seconds. val tripOptions = TripModelOptions.builder().setRefreshIntervalMillis(2000).build() tripModel.setTripModelOptions(tripOptions)
Teilen der Reise beenden
Deaktivieren Sie die Freigabe von Reiseplänen, wenn sie nicht mehr benötigt werden, z. B. wenn die Hostaktivität gelöscht wird. Dadurch werden auch Netzwerkanfragen an Fleet Engine gestoppt und Speicherlecks verhindert.
Der folgende Beispielcode zeigt, wie Sie die Freigabe von Kaufprozessen beenden.
Java
public class MainActivity extends AppCompatActivity
implements ConsumerViewModel.JourneySharingListener {
// Class implementation
@Override
protected void onDestroy() {
super.onDestroy();
if (journeySharingSession != null) {
journeySharingSession.stop();
}
}
}
Kotlin
class SampleAppActivity : AppCompatActivity(), ConsumerViewModel.JourneySharingListener {
// Class implementation
override fun onDestroy() {
super.onDestroy()
journeySharingSession?.stop()
}
}
Fehler bei Fahrten verarbeiten
Die Methode onTripRefreshError
zeigt Fehler an, die während der Fahrtüberwachung auftreten.
Zuordnung für das Consumer SDK
folgen denselben HTTP/RPC-Richtlinien wie für
Google Cloud Platform:
Häufige Fehler, die bei der Fahrtüberwachung auftreten:
HTTP | RPC | Beschreibung |
---|---|---|
400 | INVALID_ARGUMENT | Der Kunde hat einen ungültigen Reisenamen angegeben. Die
Fahrtname muss dem Format
providers/{provider_id}/trips/{trip_id}
Die provider_id muss die ID des
Cloud-Projekt, das dem Dienstanbieter gehört. |
401 | NICHT AUTHENTIFIZIERT | Anfrage konnte aufgrund eines Ungültiges JWT-Token. Dieser Fehler tritt auf wenn das JWT-Token ohne Fahrt signiert ist ID oder das JWT-Token ist abgelaufen. |
403 | PERMISSION_DENIED | Kunde hat nicht genügend Berechtigung. Dieser Fehler tritt auf, wenn das JWT ist ungültig, der Client hat keine oder die API ist nicht für des Kundenprojekts. Das JWT-Token kann Fehlt oder das Token ist mit einer Fahrt unterschrieben. ID, die nicht mit der angeforderten Reise-ID übereinstimmt. |
429 | RESOURCE_EXHAUSTED | Das Ressourcenkontingent beträgt null oder hat den Wert des Traffics überschreitet das Limit. |
503 | UNAVAILABLE | Dienst nicht verfügbar: In der Regel ist gesunken. |
504 | DEADLINE_EXCEEDED | Die Frist der Anfrage wurde überschritten. Dadurch wird nur passieren, wenn der Aufrufer eine Frist festlegt der kürzer als der Standardwert der Methode ist, Frist (d.h., der angeforderte Termin ist nicht damit der Server die Daten Anfrage) und die Anfrage wurde nicht abgeschlossen. innerhalb der Frist einhalten. |
Weitere Informationen finden Sie unter Fehlerbehandlung beim Consumer SDK.