Puoi utilizzare l'SDK consumer per creare ed eseguire un'app consumer di base integrata con i servizi di backend Ride and Deliveries on demand. Puoi creare un'app Trip and Order Progress che può visualizzare una corsa attiva, rispondere agli aggiornamenti della corsa e gestire gli errori della corsa.
Poiché l'SDK Consumer ha un'architettura modulare, puoi utilizzare le parti dell'API che vuoi utilizzare per la tua app specifica e integrarle con le tue API, i servizi di backend forniti da Fleet Engine e le API aggiuntive di Google Maps Platform.
Requisiti minimi di sistema
Sul dispositivo deve essere installato Android 5.0 (livello API 21) o versioni successive.
Prerequisiti
Gli SDK Android per i trasporti e la logistica vengono pubblicati in un repository Maven di Artifact Registry. Il repository include i file Project Object Model (.pom) dell'SDK e i documenti Java offline.
Accedi
Se sei un cliente Google Workspace, crea un gruppo Workspace, ad esempio google-maps-platform-sdk-users@workspacedomain.com
, durante l'onboarding e fornisci il nome a Google. Questo è l'approccio consigliato.
Il tuo gruppo di Workspace verrà quindi aggiunto a una lista consentita che concede l'accesso al repository Maven gmp-artifacts/transportation
.
Conferma che l'elenco delle email degli utenti e degli account di servizio che richiedono l'accesso sia incluso.
Se la tua organizzazione non può creare gruppi Workspace, invia a Google un elenco di indirizzi email degli account utente e di servizio che devono accedere a questi elementi.
Sviluppo locale
Per lo sviluppo locale, è sufficiente accedere con Cloud SDK.
gcloud
gcloud auth login
L'indirizzo email utilizzato per l'accesso deve essere un membro del gruppo Workspace.
Automazione (sistemi build o integrazione continua)
Configura gli host di automazione in base alle best practice:
Se il tuo processo viene eseguito in un ambiente Google Cloud, utilizza il rilevamento automatico delle credenziali.
Altrimenti, archivia il file della chiave dell'account di servizio in una posizione sicura nel file system dell'host e imposta la variabile di ambiente GOOGLE_APPLICATION_CREDENTIALS in modo appropriato.
L'indirizzo email dell'account di servizio associato alle credenziali deve essere membro del gruppo Workspace.
Configurazione
Configura Maven o Gradle per rilevare automaticamente le credenziali dell'utente o del servizio.
Gradle
Aggiungi quanto segue al file build.gradle
del modulo della tua app, non al file build.gradle
del modulo principale del progetto:
plugins {
id "com.google.cloud.artifactregistry.gradle-plugin" version "2.1.5"
}
repositories {
maven {
url "artifactregistry://us-west2-maven.pkg.dev/gmp-artifacts/transportation"
}
}
Maven
Aggiungi il seguente codice al tuo pom.xml
:
<repositories>
<repository>
<id>gmp-artifacts</id>
<url>artifactregistry://us-west2-maven.pkg.dev/gmp-artifacts/transportation</url>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
<build>
<extensions>
<extension>
<groupId>com.google.cloud.artifactregistry</groupId>
<artifactId>artifactregistry-maven-wagon</artifactId>
<version>2.1.5</version>
</extension>
</extensions>
</build>
Per informazioni sulla verifica dell'accesso, consulta Gestione dei pacchetti Java.
Configurazione progetto
Per utilizzare l'SDK Consumer per Android, la tua app deve avere come target minSdkVersion
19 o versioni successive.
Per eseguire un'app creata con l'SDK Consumer, è necessario che sul dispositivo Android sia installato Google Play Services.
Configura il progetto di sviluppo
Per configurare il progetto di sviluppo e ricevere una chiave API per il progetto in Google Cloud Console:
Creare un nuovo progetto della console Google Cloud o selezionare un progetto esistente da utilizzare con l'SDK Consumer. Attendi qualche minuto finché il nuovo progetto non sarà visibile nella console Google Cloud.
Per eseguire l'app demo, il tuo progetto deve avere accesso all'SDK di Maps per Android. In Google Cloud Console, seleziona API e servizi > Libreria, quindi cerca e attiva l'SDK Maps per Android.
Per ottenere una chiave API per il progetto, seleziona API e servizi > Credenziali > Crea credenziali > Chiave API. Per scoprire di più su come ottenere una chiave API, consulta Ottenere una chiave API.
Aggiungi l'SDK Consumer alla tua app
L'SDK Consumer è disponibile tramite un Repository Maven privato. Il repository include i file Project Object Model (.pom) dell'SDK e i documenti Java. Per aggiungere l'SDK Consumer alla tua app:
Configura l'ambiente per accedere al repository Maven dell'host come descritto in Ottenere l'accesso.
Se hai dichiarato la configurazione centralizzata della gestione delle dipendenze in
settings.gradle
, disabilitala come segue.Rimuovi il seguente blocco di codice in
settings.gradle
:import org.gradle.api.initialization.resolve.RepositoriesMode dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() } }
Aggiungi la seguente dipendenza alla configurazione Gradle o Maven, sostituendo il segnaposto
VERSION_NUMBER
con la versione desiderata dell'SDK Consumer.Gradle
Aggiungi il seguente codice al tuo
build.gradle
:dependencies { ... implementation 'com.google.android.libraries.mapsplatform.transportation:transportation-consumer:VERSION_NUMBER' }
Maven
Aggiungi il seguente codice al tuo
pom.xml
:<dependencies> ... <dependency> <groupId>com.google.android.libraries.mapsplatform.transportation</groupId> <artifactId>transportation-consumer</artifactId> <version>VERSION_NUMBER</version> </dependency> </dependencies>
Aggiungi la chiave API alla tua app
Dopo aver aggiunto l'SDK Consumer alla tua app, aggiungi la chiave API alla tua app. Devi utilizzare la chiave API del progetto che hai ottenuto durante la configurazione del progetto di sviluppo.
Questa sezione descrive come archiviare la chiave API in modo che possa essere fatto riferimento in modo più sicuro dall'app. Non dovresti controllare la chiave API nel sistema di controllo della versione. Deve essere archiviato nel file local.properties
, che si trova nella directory principale del tuo progetto. Per ulteriori informazioni sul file local.properties
, consulta File delle proprietà Gradle.
Per semplificare questa attività, puoi utilizzare il plug-in Secrets Gradle per Android.
Per installare il plug-in e archiviare la chiave API:
Apri il file
build.gradle
a livello principale e aggiungi il codice seguente all'elementodependencies
inbuildscript
.Trendy
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") } }
Apri il file
build.gradle
a livello di app e aggiungi il seguente codice all'elementoplugins
.Trendy
id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
Kotlin
id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin")
Se utilizzi Android Studio, sincronizza il progetto con Gradle.
Apri
local.properties
nella directory a livello di progetto e aggiungi il codice seguente. SostituisciYOUR_API_KEY
con la tua chiave API.MAPS_API_KEY=YOUR_API_KEY
Nel file
AndroidManifest.xml
, vai alla paginacom.google.android.geo.API_KEY
e aggiorna l'attributoandroid:value
nel seguente modo:<meta-data android:name="com.google.android.geo.API_KEY" android:value="${MAPS_API_KEY}" />
L'esempio seguente mostra un manifest completo per un'app di esempio.
<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>
Includi le attribuzioni richieste nella tua app
Se utilizzi l'SDK Consumer nella tua app, devi includere il testo di attribuzione e le licenze open source nella sezione delle note legali della tua app. È meglio includere le attribuzioni come voce di menu indipendente o come parte di una voce di menu Informazioni.
Puoi trovare il testo di attribuzione richiesto e le licenze open source nel file ZIP Ridesharing Consumer SDK:
NOTICE.txt
LICENSES.txt
Autenticazione SDK consumer
L'SDK consumer fornisce l'autenticazione tramite token web JSON. Un token web JSON (JWT) è un token di accesso di base JSON che fornisce una o più rivendicazioni su un servizio. Ad esempio, un server potrebbe generare un token con la dichiarazione "logato come amministratore" e fornirlo a un client. Il client può quindi utilizzare il token per dimostrare che ha eseguito l'accesso come amministratore.
L'SDK consumer utilizza il token web JSON fornito dall'applicazione per comunicare con il parco risorse. Per ulteriori informazioni, consulta Autenticazione e autorizzazione del parco risorse.
Il token di autorizzazione consente di accedere ai seguenti servizi di Fleet Engine:
TripService
: consente all'SDK per i consumatori di accedere a dettagli sulla corsa, tra cui la posizione del veicolo, il percorso e l'orario di arrivo stimato. I token di autorizzazione per il servizio di viaggio devono includere una rivendicazionetripid:TRIP_ID
nell'intestazioneauthorization
del token, doveTRIP_ID
è l'ID corsa.VehicleService
: fornisce all'SDK Consumer le informazioni sulla posizione del veicolo arricchita per la visualizzazione del livello di densità del veicolo e la stima degli ATE. Poiché l'SDK Consumer utilizza solo le località fughed, i token di autorizzazione per il servizio veicolo non richiedono una rivendicazionevehicleid
.
JSON Token web web
L'SDK consumer registra un callback del token di autorizzazione con l'applicazione durante l'inizializzazione. L'SDK chiama l'applicazione per ricevere un token per tutte le richieste di rete che richiedono l'autorizzazione.
Ti consigliamo vivamente di utilizzare i token di autorizzazione della cache di implementazione dei callback e di aggiornarli solo una volta trascorso il tempo di expiry
. I token devono essere emessi con una scadenza di un'ora.
Il callback del token di autorizzazione specifica quale token di servizio è necessario per il servizio TripService
. Fornisce inoltre il tripId
obbligatorio per il contesto.
Il seguente esempio di codice mostra come implementare un callback del token di autorizzazione.
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
}
}
}
Inizializza l'API
Prima di seguire queste procedure, si presume che tu abbia abilitato i servizi appropriati e l'SDK Consumer.
Recupera l'istanza ConsumerApi
Per utilizzare l'SDK Consumer, la tua app deve inizializzare ConsumerApi
in modo asincrono. L'API è un singleton.
Il metodo di inizializzazione richiede un AuthTokenFactory
. La fabbrica genera nuovi token JWT per l'utente quando necessario.
providerId
è l'ID progetto del progetto Google Cloud. Consulta la Guida dell'utente di Fleet Engine per ulteriori informazioni sulla creazione del progetto.
La tua app deve implementare l'AuthTokenFactory
come descritto in
Autenticazione dell'SDK del consumatore.
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
}
Crea l'interfaccia utente
Puoi utilizzare ConsumerMapFragment
o ConsumerMapView
per creare l'interfaccia utente per la tua applicazione. ConsumerMapFragment
ti consente di definire
la tua mappa utilizzando un
Fragment
mentre ConsumerMapView
ti consente di utilizzare un
View
. La funzionalità di ride sharing è la stessa sia in ConsumerMapView
che in ConsumerMapFragment
, quindi puoi sceglierne una in base a se View
o Fragment
sono i migliori per la tua applicazione.
Aggiunta del supporto per il drawable API 19 (KitKat) e Vector
Se il design dell'app richiede il supporto per i dispositivi API 19 (KitKat) e i drawable vettoriale, aggiungi il seguente codice alla tua attività. Questo codice estende AppCompatActivity
per utilizzare i bozze di Vector nell'SDK Consumer.
Java
// ...
import android.support.v7.app.AppCompatActivity;
// ...
public class ConsumerTestActivity extends AppCompatActivity {
// ...
}
Kotlin
// ...
import android.support.v7.app.AppCompatActivity
// ...
class ConsumerTestActivity : AppCompatActivity() {
// ...
}
Aggiungere il frammento o la vista della mappa
Puoi creare la mappa per visualizzare la condivisione dei percorsi in un frammento o una vista di Android, che hai definito nel file XML di layout dell'applicazione (situato in /res/layout
). Il frammento (o la vista) fornisce quindi l'accesso alla mappa di condivisione del percorso, a cui la tua app può accedere e modificare. La mappa fornisce anche un handle per ConsumerController
, che consente alla tua app di controllare e personalizzare l'esperienza di condivisione dei percorsi.
Mappa e controller di condivisione del percorso
Puoi definire la mappa di condivisione del percorso come frammento (tramite ConsumerMapFragment
) o come vista (utilizzando ConsumerMapView
), come mostrato nel seguente esempio di codice. Il tuo metodo onCreate()
dovrebbe quindi chiamare
getConsumerGoogleMapAsync(callback)
, che restituisce ConsumerGoogleMap
in modo asincrono nel callback. In seguito, utilizzi ConsumerGoogleMap
per visualizzare la condivisione del percorso e puoi aggiornarlo in base alle esigenze della tua app.
Frammento ConsumerMap
Devi definire il frammento nel file XML di layout dell'applicazione, come mostrato nell'esempio di codice seguente.
<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" />
La chiamata a getConsumerGoogleMapAsync()
deve provenire dal metodo onCreate()
.
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
La vista può essere utilizzata in un frammento o in un'attività, come definito nel file XML.
<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" />
La chiamata a getConsumerGoogleMapAsync()
deve provenire da onCreate()
. Oltre al parametro di callback, richiede l'attività o il frammento contenitore e GoogleMapOptions
(che può essere nullo) contenente attributi di configurazione per MapView
. L'attività o la classe di base del frammento devono essere FragmentActivity
o un supporto Fragment
(rispettivamente), poiché forniscono accesso al relativo ciclo di vita.
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,
)
}
}
Un MapView
in un frammento è lo stesso dell'esempio precedente per MapView
in un'attività, tranne per il fatto che il frammento gonfia il layout che include MapView
nel metodo onCreateView()
del frammento.
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)
}
}
Regolare lo zoom della fotocamera per mettere a fuoco un percorso
Il pulsante La mia posizione predefinito integrato in Maps SDK centra la fotocamera sulla posizione del dispositivo.
Se è attiva una sessione di condivisione del percorso, potresti voler centrare la fotocamera per concentrarti sul percorso anziché sulla posizione del dispositivo.
SDK Consumer per soluzione integrata Android: AutoVideocamera
Per consentirti di concentrarti sul percorso anziché sulla posizione del dispositivo, l'SDK Consumer fornisce una funzionalità della fotocamera automatica abilitata per impostazione predefinita. La videocamera aumenta lo zoom per mettere a fuoco il percorso di condivisione del percorso e il tappa successiva.
Personalizzare il comportamento della videocamera
Se hai bisogno di un maggiore controllo sul comportamento della videocamera, puoi disattivare o attivare la fotocamera automatica utilizzando ConsumerController.setAutoVideocameraEnabled().
ConsumerController.getcameraUpdate() restituisce i limiti della videocamera consigliati in quel momento. Puoi quindi fornire questo CameraUpdate
come argomento a
GoogleMap.move Camera() o GoogleMap.animate Camera().
Accedere a car sharing e mappe
Per supportare il ridesharing e l'interazione con la mappa nella tua applicazione, devi accedere a ConsumerGoogleMap
e ConsumerController
.
ConsumerMapFragment
e
ConsumerMapView
restituiscono in modo asincrono
ConsumerGoogleMap
in ConsumerMapReadyCallback
.
ConsumerGoogleMap
restituisce
ConsumerController
da getConsumerController()
. Puoi accedere a ConsumerGoogleMap
e ConsumerController
come segue.
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,
}
)
Mappa Google di consumatore
ConsumerGoogleMap
è una classe wrapper per la classe GoogleMap
. Consente all'app di interagire con la mappa utilizzando un'API equivalente a GoogleMap
. L'uso della mappa consumer consente alla tua app e alla condivisione dei viaggi di interagire perfettamente con la stessa mappa Google sottostante. Ad esempio, GoogleMap
consente una sola registrazione di callback, ma ConsumerGoogleMap
supporta i doppi callback registrati.
Questi callback consentono alla tua app e alla condivisione delle corse di registrare i callback chiamati in sequenza.
ConsumerController
ConsumerController
consente di accedere alle funzionalità di condivisione delle corse, tra cui il monitoraggio dei viaggi, il controllo dello stato delle corse e l'impostazione delle località.
Configurare la condivisione dei percorsi
Dopo che il backend ha abbinato un consumatore a un veicolo, utilizza JourneySharingSession
per iniziare il percorso di condivisione dell'interfaccia utente. La condivisione del percorso mostra la
posizione e il percorso del veicolo corrispondenti. Dopo aver implementato l'SDK nell'app, puoi aggiungere la funzionalità di monitoraggio dei viaggi, ascolto degli aggiornamenti e gestione degli errori.
Le seguenti procedure presuppongono che i servizi di backend siano in atto e che i tuoi servizi per mettere in contatto i consumatori con i veicoli siano operativi.
Registra un listener su un oggetto
TripModel
per ricevere dettagli sulla corsa, come l'orario di arrivo stimato e la distanza che il veicolo deve percorrere prima dell'arrivo.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?, ) { // ... } // ... })
Configura il viaggio utilizzando
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)
Interrompi condivisione percorso
Assicurati di interrompere la condivisione del percorso quando non è più necessaria, ad esempio quando l'attività host viene distrutta. L'interruzione della condivisione del percorso interrompe anche le richieste di rete a Fleet Engine e previene le perdite di memoria.
Il seguente codice di esempio illustra come interrompere la condivisione del percorso.
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()
}
}
Gestire gli errori della corsa
Il metodo onTripRefreshError
segnala errori che si verificano durante il monitoraggio delle corse.
La mappatura degli errori degli SDK consumer segue le stesse linee guida HTTP/RPC stabilite per Google Cloud Platform.
Gli errori comuni visualizzati durante il monitoraggio delle corse includono:
HTTP | RPC | Descrizione |
---|---|---|
400 | INVALID_ARGUMENT | Il client ha specificato un nome di corsa non valido. Il nome della corsa deve seguire il formato providers/{provider_id}/trips/{trip_id} .
provider_id deve essere l'ID del progetto cloud di proprietà del provider di servizi. |
401 | NON AUTENTICATO | Richiesta non autenticata a causa di un token JWT non valido. Questo errore si verifica se il token JWT viene firmato senza un ID corsa o se il token JWT è scaduto. |
403 | PERMISSION_DENIED (Autorizzazione negata) | Il client non dispone di autorizzazioni sufficienti. Questo errore si verifica se il token JWT non è valido, il client non dispone dell'autorizzazione o se l'API non è abilitata per il progetto client. Potrebbe mancare il token JWT o essere firmato con un ID corsa che non corrisponde all'ID corsa richiesto. |
429 | RISORSA_ESAUSTA | La quota delle risorse è pari a zero o la frequenza del traffico supera il limite. |
503 | NON DISPONIBILE | Servizio non disponibile. In genere il server non è attivo. |
504 | SCADENZA_SUPERATA | Scadenza richiesta superata. Questo accade solo se il chiamante imposta una scadenza inferiore alla scadenza predefinita del metodo (ovvero la scadenza richiesta non è sufficiente per il server per elaborare la richiesta) e la richiesta non è stata completata entro la scadenza. |
Per ulteriori informazioni, consulta Gestione degli errori degli SDK per i consumatori.