Puedes usar el SDK para consumidores a fin de compilar y ejecutar una app para consumidores básica integrada. con los servicios de backend de la solución On-demand Rides and Deliveries. Puedes crear una aplicación de progreso del viaje y el pedido que puede mostrar un viaje activo responder a las actualizaciones de viaje y manejar los errores de los viajes.
Debido a que el SDK del consumidor tiene una arquitectura modular, puedes usar las partes de la API que quieres usar para tu app en particular e integrarlas con tus propias APIs, los servicios de backend que proporciona Fleet Engine y las APIs de Add de Google Maps Platform.
Requisitos mínimos del sistema
El dispositivo móvil debe ejecutar Android 6,0 (nivel de API 23) o una versión posterior.
Configuración de compilaciones y dependencias
Las versiones 1.99.0 y posteriores del SDK para consumidores están disponibles con la API de en un repositorio de confianza. El canal del repositorio privado que se usaba anteriormente dejó de estar disponible.
Gradle
Agrega lo siguiente a tu archivo build.gradle
:
repositories {
...
google()
}
Maven
Agrega lo siguiente a tu archivo pom.xml
:
<project>
...
<repositories>
<repository>
<id>google-maven-repository</id>
<url>https://maven.google.com</url>
</repository>
</repositories>
...
</project>
Configuración del proyecto
Para usar el SDK para consumidores de Android, tu app debe orientarse
minSdkVersion
23 o una versión posterior
Para ejecutar una aplicación compilada con el SDK para consumidores, el SDK de Android el dispositivo debe tener Servicios de Google Play esté instalado.
Configura tu proyecto de desarrollo
Cómo configurar tu proyecto de desarrollo y obtener una clave de API para el proyecto en la consola de Google Cloud:
Crea un proyecto nuevo de la consola de Google Cloud o selecciona uno existente para usarlo. con el SDK para consumidores. Espera unos minutos hasta que el proyecto nuevo se puede ver en la consola de Google Cloud.
Para ejecutar la app de demostración, tu proyecto debe tener acceso al SDK de Maps para Android. En la consola de Google Cloud, selecciona APIs y Servicios > Biblioteca y, luego, busca y habilita el SDK de Maps para Android
Para obtener una clave de API para el proyecto, selecciona APIs y Servicios > Credenciales > Crear credenciales > Clave de API Para más información sobre cómo obtener una clave de API, consulta Obtén una clave de API.
Agrega el SDK para consumidores a tu app
El SDK para consumidores está disponible a través de un repositorio privado de Maven. El incluye los archivos del modelo de objetos del proyecto (.pom) del SDK y Javadocs. Para agregar el SDK de consumidor a tu app, haz lo siguiente:
Configura tu entorno para acceder al repositorio de Maven host como se describe en la sección anterior.
Si tienes una configuración de administración de dependencias centralizada declarada en
settings.gradle
, inhabilítalo de la siguiente manera.Quita el siguiente bloque de código de
settings.gradle
:import org.gradle.api.initialization.resolve.RepositoriesMode dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() } }
Agrega la siguiente dependencia a tu configuración de Gradle o Maven y reemplaza el Es el marcador de posición
VERSION_NUMBER
para la versión deseada del SDK de consumidor.Gradle
Agrega lo siguiente a tu
build.gradle
:dependencies { ... implementation 'com.google.android.libraries.mapsplatform.transportation:transportation-consumer:VERSION_NUMBER' }
Maven
Agrega lo siguiente a tu
pom.xml
:<dependencies> ... <dependency> <groupId>com.google.android.libraries.mapsplatform.transportation</groupId> <artifactId>transportation-consumer</artifactId> <version>VERSION_NUMBER</version> </dependency> </dependencies>
El SDK para consumidores depende del SDK de Maps. Esta dependencia se configura de tal manera de manera que, si la versión del SDK de Maps no se define explícitamente en el archivo de configuración de compilación de la siguiente manera, cuando se crea una versión nueva de Maps SDK para consumidores seguirá usando la versión mínima versión compatible del SDK de Maps que requiera.
Gradle
Agrega lo siguiente a tu
build.gradle
:dependencies { ... implementation 'com.google.android.gms:play-services-maps:18.1.0' }
Maven
Agrega lo siguiente a tu
pom.xml
:<dependencies> ... <dependency> <groupId>com.google.android.gms</groupId> <artifactId>play-services-maps</artifactId> <version>18.1.0</version> </dependency> </dependencies>
Agrega la clave de API a tu app
Una vez que hayas agregado el SDK de consumidor a tu app, agrega la clave de API a tu app. Debes usar la clave de API del proyecto que obtuviste cuando hiciste lo siguiente: configura tu proyecto de desarrollo.
En esta sección, se describe cómo almacenar tu clave de API para que pueda ser más segura.
a los que hace referencia tu app. No debes incluir tu clave de API en tu versión
un sistema de control de calidad. Debe almacenarse en el archivo local.properties
, que se
ubicado en el directorio raíz de tu proyecto. Para obtener más información sobre el
local.properties
, consulta
Archivos de propiedades de Gradle.
Para optimizar esta tarea, puedes usar el complemento Secrets Gradle para Android.
Para instalar el complemento y almacenar tu clave de API, haz lo siguiente:
Abre el archivo
build.gradle
en el nivel raíz y agrega el siguiente código al Elementodependencies
enbuildscript
.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") } }
Abre el archivo
build.gradle
a nivel de la app y agrega el siguiente código al elementoplugins
.Groovy
id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
Kotlin
id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin")
Si usas Android Studio, sincronizar tu proyecto con Gradle.
Abre el archivo
local.properties
en el directorio de nivel de proyecto y, luego, agrega el archivo siguiente código. ReemplazaYOUR_API_KEY
por tu clave de API.MAPS_API_KEY=YOUR_API_KEY
En tu archivo
AndroidManifest.xml
, ve acom.google.android.geo.API_KEY
. Luego, actualiza el atributoandroid:value
de la siguiente manera:<meta-data android:name="com.google.android.geo.API_KEY" android:value="${MAPS_API_KEY}" />
En el siguiente ejemplo, se muestra un manifiesto completo para una app de ejemplo:
<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>
Incluye las atribuciones requeridas en tu aplicación
Si usas el SDK para consumidores en tu app, debes incluir texto de atribución y licencias de código abierto como parte de los avisos legales de tu app sección. Es mejor incluir las atribuciones como un elemento de menú independiente o como parte de un elemento de menú Acerca de.
La información sobre las licencias se encuentra en el archivo “third_party_licenses.txt”. archivo en el archivo AAR desarchivado.
Consulta https://developers.google.com/android/guides/opensource. sobre cómo incluir avisos de código abierto.
Autenticación del SDK de consumidor
El SDK del consumidor proporciona autenticación mediante tokens web JSON. Un token web JSON (JWT) es un token de acceso basado en JSON que proporciona uno o más reclamos sobre un servicio. Por ejemplo, un servidor podría generar un token que tenga la reclamación “acceded as admin” (acceso como administrador) y proporcionan a un cliente. Luego, el cliente podría usar ese token para demostrar que Accediste como administrador.
El SDK del consumidor usa el token web JSON que proporciona la aplicación para comunicarse con Fleet Engine. Consulta Autenticación y autorización de Flet Engine para obtener más información.
El token de autorización debe incluir una reclamación tripid:TRIP_ID
en el
authorization
, en el que TRIP_ID
es el ID del viaje. Esto le brinda al consumidor
Acceso al SDK a los detalles del viaje, como la posición del vehículo, la ruta y la hora de llegada estimada
Devoluciones de llamada de token web JSON
El SDK de consumidor registra una devolución de llamada de token de autorización. con la aplicación durante la inicialización. El SDK llama a la aplicación a fin de obtener un token para todas las solicitudes de red que requieran autorización.
Te recomendamos que autorices la autorización de la caché de implementación de devolución de llamada.
y actualizarlos solo cuando haya transcurrido el tiempo expiry
. Los tokens deben
emitirse con un vencimiento de una hora.
La devolución de llamada del token de autorización especifica qué token de servicio se necesita.
para el servicio TripService
. También proporciona el tripId
requerido.
para conocer el contexto.
En el siguiente ejemplo de código, se muestra cómo implementar una autorización la devolución de llamada de token.
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
}
}
}
Cómo inicializar la API
Antes de seguir estos procedimientos, se supone que habilitaste las los servicios adecuados y el SDK del consumidor.
Obtén la instancia ConsumerApi
Para usar el SDK de consumidor, tu app debe inicializarse
ConsumerApi
de forma asíncrona. La API es un singleton.
El método de inicialización toma un AuthTokenFactory
. La fábrica genera nuevas
Tokens JWT para el usuario cuando sea necesario
El providerId
es el ID de tu proyecto de Google Cloud. Consulta la
Guía del usuario de Flet Engine
para obtener más información sobre la creación del proyecto.
Tu app debe implementar AuthTokenFactory
como se describe en
Autenticación del SDK de consumidor.
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
}
SDK de Maps y procesadores de mapas
La versión 2.x.x del SDK para consumidores es compatible con la versión 18.1.0 y posteriores del SDK de Maps para Android. La tabla
a continuación, se resume el procesador predeterminado por versión del SDK de Maps y la compatibilidad
de ambos procesadores. Sin embargo, recomendamos usar el procesador más reciente si necesitas
usar el renderizador heredado, puedes especificarlo explícitamente
MapsInitializer.initialize()
Versión del SDK de Maps | Admite el procesador más reciente | Admite el procesador heredado | Procesador predeterminado |
---|---|---|---|
V18.1.0 y versiones anteriores | Sí | Sí | Heredado* |
V18.2.0 | Sí | Sí | Más reciente |
* Con el lanzamiento del nuevo procesador de Maps, el procesador más reciente será el predeterminado.
Agrega el SDK de Maps como dependencia
Gradle
Agrega lo siguiente a tu build.gradle
:
dependencies {
//...
implementation "com.google.android.gms:play-services-maps:VERSION_NUMBER"
}
Maven
Agrega lo siguiente a tu pom.xml
:
<dependencies>
...
<dependency>
<groupId>com.google.android.gms</groupId>
<artifactId>play-services-maps</artifactId>
<version>18.1.0</version>
</dependency>
</dependencies>
Inicializa el SDK de Maps antes de inicializar el SDK para consumidores
En tu clase Application
o inicial de Activity
, llama
MapsInitializer.initialize()
y espera el resultado de la solicitud del renderizador antes de inicializar
SDK del consumidor.
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()
}
})
}
Crea la interfaz de usuario
Puedes usar ConsumerMapFragment
o
ConsumerMapView
para crear la interfaz de usuario de tu
y mantener la integridad de su aplicación. ConsumerMapFragment
te permite definir
tu mapa con una
Fragment
, mientras que ConsumerMapView
te permite usar una
View
. Transporte compartido
es la misma en ConsumerMapView
y
ConsumerMapFragment
para que puedas elegir uno según
ya sea View
o
Fragment
es mejor para tu aplicación.
Se agregó compatibilidad con el nivel de API 19 (KitKat) y elementos de diseño vectoriales.
Si el diseño de tu app requiere compatibilidad con dispositivos con API 19 (KitKat) y elementos de diseño vectoriales,
agrega el siguiente código a tu actividad. Este código extiende
AppCompatActivity
para usar
Elementos de diseño vectoriales en el SDK del consumidor
Java
// ...
import android.support.v7.app.AppCompatActivity;
// ...
public class ConsumerTestActivity extends AppCompatActivity {
// ...
}
Kotlin
// ...
import android.support.v7.app.AppCompatActivity
// ...
class ConsumerTestActivity : AppCompatActivity() {
// ...
}
Cómo agregar el fragmento o la vista del mapa
Crea el mapa para mostrar los recorridos compartidos en un fragmento de Android
o una vista, que defines en el archivo XML de diseño de tu aplicación (ubicado en
/res/layout
). Luego, el fragmento (o la vista) proporciona acceso al recorrido.
que comparte el mapa, al que tu app puede acceder y modificar. El mapa también proporciona un
controlador a ConsumerController
, lo que permite que tu app controle y
personalizar la experiencia de compartir recorridos.
Mapa y controlador para compartir la exploración
El mapa para compartir el recorrido se define como un fragmento (usando
ConsumerMapFragment
) o como una vista (con ConsumerMapView
), como se muestra en el
siguiente ejemplo de código. Entonces, tu método onCreate()
debería llamar
getConsumerGoogleMapAsync(callback)
, que muestra el ConsumerGoogleMap
de forma asíncrona en la devolución de llamada. Luego, usa ConsumerGoogleMap
para mostrar
el recorrido compartido y se puede actualizar según sea necesario en tu app.
ConsumerMapFragment
Debes definir el fragmento en el archivo XML de diseño de tu aplicación, como se muestra en el siguiente ejemplo de código.
<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 llamada a getConsumerGoogleMapAsync()
debe provenir del 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 se puede usar en un fragmento o en una actividad, como se define en tu 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 llamada a getConsumerGoogleMapAsync()
debe ser de onCreate()
. En
además del parámetro de devolución de llamada, requiere la actividad contenedora o
fragmento y GoogleMapOptions
(que puede ser nulo), que contiene la configuración
para el MapView
. La clase básica de la actividad o del fragmento debe ser una de las siguientes opciones:
un FragmentActivity
o un Fragment
de asistencia (respectivamente), ya que proporcionan
acceso a su ciclo de vida.
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
en un fragmento es el mismo que en el ejemplo anterior para MapView
en
una actividad, con la excepción de que el fragmento aumenta el diseño que incluye las
MapView
en el método del fragmento onCreateView()
.
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)
}
}
Cómo ajustar el zoom de la cámara para enfocar un viaje
El botón Mi ubicación predeterminado integrado en el SDK de Maps centra la cámara en la ubicación del dispositivo.
Si hay una sesión activa de Viajes compartidos, te recomendamos centrar la cámara. en el recorrido, en lugar de en la ubicación del dispositivo.
Solución integrada del SDK de consumidor para Android: AutoCamera
Para que puedas enfocarte en el viaje en lugar de en la ubicación del dispositivo, la El SDK de consumidor proporciona una función de AutoCamera que es habilitado de forma predeterminada. La cámara se acerca para enfocarse en la ruta para compartir el viaje y el próximo punto de referencia.
Cómo personalizar el comportamiento de la cámara
Si necesitas más control del comportamiento de la cámara, puedes inhabilitar o habilitar cámara automática mediante ConsumerController.setAutoCameraEnabled().
ConsumerController.getCameraUpdate() muestra los límites de cámara recomendados en ese momento. Luego, puedes proporcionar este CameraUpdate
como argumento para
GoogleMap.moveCamera() o GoogleMap.animateCamera().
Accede a mapas y transporte compartido
Para admitir el transporte compartido y la interacción con el mapa en tu aplicación, debes tener acceso
a ConsumerGoogleMap
y
ConsumerController
ConsumerMapFragment
y
ConsumerMapView
se muestran de forma asíncrona
ConsumerGoogleMap
en ConsumerMapReadyCallback
Devoluciones por ConsumerGoogleMap
ConsumerController
de getConsumerController()
. Tú
puede acceder a ConsumerGoogleMap
y
ConsumerController
de la siguiente manera:
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
es una clase wrapper para el
Clase GoogleMap
. Le proporciona a tu app la capacidad de
interactuar con el mapa utilizando una API que sea equivalente a
GoogleMap
Usar el mapa del consumidor permite que tu app y viajes
para interactuar sin problemas con el mismo GoogleMap subyacente. Por ejemplo:
GoogleMap
solo permite un registro de devolución de llamada, pero
ConsumerGoogleMap
admite devoluciones de llamada registradas duales.
Estas devoluciones de llamada permiten que tu app y el servicio de transporte privado con conductor registren devoluciones de llamada que se
que se llama secuencialmente.
ConsumerController
ConsumerController
brinda acceso a la función de transporte privado con conductor, como
como supervisar viajes, controlar el estado de los viajes y configurar ubicaciones.
Cómo configurar la opción para compartir viajes
Después de que el backend haya encontrado una coincidencia entre un consumidor y un vehículo, usa JourneySharingSession
.
para comenzar la interfaz de usuario de compartir el recorrido. En la sección Compartir viajes, se muestran
la ubicación y ruta del vehículo. Después de implementar el SDK en tu app, puedes agregar
la funcionalidad para supervisar viajes, detectar actualizaciones y administrar errores.
Los siguientes procedimientos suponen que los servicios de backend están implementados y que tu
para conectar a los consumidores con vehículos.
Registra un objeto de escucha en un objeto
TripModel
para obtener detalles sobre el viaje, como la hora de llegada estimada y la distancia que el vehículo debe recorrer antes de la llegada.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 tu viaje con
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)
Dejar de compartir el viaje
Asegúrate de dejar de compartir el recorrido cuando ya no sea necesario, como cuando se destruye la actividad del host. Dejar de compartir el recorrido también detiene las solicitudes de red a Fleet Engine y evita las fugas de memoria.
En el siguiente código de muestra, se muestra cómo dejar de compartir el recorrido.
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()
}
}
Maneja errores de viajes
El método onTripRefreshError
muestra errores que ocurren durante la supervisión de viajes.
El mapeo del SDK de consumidor
siguen las mismas pautas HTTP/RPC establecidas para
Google Cloud Platform.
Estos son algunos de los errores comunes que surgen durante la supervisión de viajes:
HTTP | RPC | Descripción |
---|---|---|
400 | INVALID_ARGUMENT | El cliente especificó un nombre de viaje no válido. El
el nombre del viaje debe seguir el formato
providers/{provider_id}/trips/{trip_id}
El provider_id debe ser el ID de la
El proyecto de Cloud propiedad del proveedor de servicios. |
401 | UNAUTHENTICATED | La solicitud no se autenticó debido a un token JWT no válido. Se producirá este error si el token JWT se firma sin un viaje id o si el token JWT venció. |
403 | PERMISSION_DENIED | El cliente no tiene suficiente permiso. Este error ocurre si el token JWT el token no es válido, el cliente no tiene permiso o la API no está habilitada para el proyecto del cliente. El token JWT podría ser falta o el token está firmado con un viaje que no coincide con el ID de viaje solicitado. |
429 | RESOURCE_EXHAUSTED | Si la cuota de recursos es cero o la tasa del tráfico excede el límite. |
503 | NO DISPONIBLE | Servicio no disponible. Por lo general, el servidor está inactivo. |
504 | DEADLINE_EXCEEDED | Se excedió el plazo de la solicitud. Si confirmas esta acción, suceder solo si el emisor establece un plazo menor que el valor predeterminado fecha límite (es decir, la fecha límite solicitada no es para que el servidor procese el solicitud) y la solicitud no finalizó dentro del plazo. |
Para obtener más información, consulta Manejo de errores del SDK de consumidor.