Za pomocą pakietu SDK dla konsumentów możesz utworzyć i uruchomić podstawową, zintegrowaną aplikację z usługami backendu rozwiązań w zakresie przejazdów i dostaw na żądanie. Możesz utworzyć aplikację Podróż i Postęp przetwarzania zamówienia, która może wyświetlać aktywną podróż, reagować na aktualizacje podróży i eliminować błędy związane z podróżami.
Pakiet SDK Consumer SDK ma architekturę modułową, można więc używać części interfejsu API, którego chcesz używać z konkretną aplikacją, i zintegruj je z własnymi interfejsami API, usługami backendu dostępnymi przez Fleet Engine i dodatkowych interfejsów API w Google Maps Platform.
Minimalne wymagania systemowe
Na urządzeniu mobilnym musi być zainstalowany Android. 6,0 (poziom interfejsu API 23) lub nowszy.
Konfiguracja kompilacji i zależności
Pakiet SDK dla klientów indywidualnych w wersji 1.99.0 lub nowszej jest dostępny za pomocą narzędzia Google Maven z repozytorium. Używany wcześniej kanał repozytorium prywatnego został wycofany.
Gradle
Dodaj do pliku build.gradle
te informacje:
repositories {
...
google()
}
Maven
Dodaj do pliku pom.xml
te informacje:
<project>
...
<repositories>
<repository>
<id>google-maven-repository</id>
<url>https://maven.google.com</url>
</repository>
</repositories>
...
</project>
Konfiguracja projektu
Aby można było używać pakietu SDK dla użytkowników Androida, aplikacja musi być kierowana
minSdkVersion
w wersji 23 lub nowszej.
Aby uruchomić aplikację stworzoną za pomocą pakietu SDK dla klientów indywidualnych, urządzenie musi mieć Usługi Google Play Zainstalowano.
Konfigurowanie projektu programistycznego
Aby skonfigurować projekt programistyczny i uzyskać klucz interfejsu API dla projektu w konsoli Google Cloud:
Utwórz nowy projekt konsoli Google Cloud lub wybierz istniejący projekt, którego chcesz użyć. za pomocą pakietu Consumer SDK. Zaczekaj kilka minut do nowy projekt będzie widoczny w konsoli Google Cloud.
Aby można było uruchomić aplikację w wersji demonstracyjnej, projekt musi mieć dostęp do pakietu Maps SDK na Androida. W konsoli Google Cloud wybierz Interfejsy API Usługi > Library, a następnie wyszukaj i włącz pakiet SDK Maps dla na urządzeniu z Androidem.
Wybierz, aby pobrać klucz interfejsu API dla projektu Interfejsy API Usługi > Dane logowania > Utwórz dane logowania > API. Więcej informacji o uzyskiwaniu klucza interfejsu API znajdziesz w artykule Uzyskaj klucz interfejsu API.
Dodaj do aplikacji pakiet SDK dla klientów indywidualnych
Pakiet SDK dla klientów indywidualnych jest dostępny w prywatnym repozytorium Maven. repozytorium zawiera pliki .pom (Project Object Model) pakietu SDK i dokumenty Javadocs. Aby dodać do aplikacji pakiet SDK dla klientów indywidualnych:
Skonfiguruj środowisko, aby uzyskać dostęp do repozytorium Maven hosta zgodnie z opisem w sekcji poprzedniej sekcji.
Jeśli masz zadeklarowaną scentralizowaną konfigurację zarządzania zależnościami w
settings.gradle
, wyłącz go w następujący sposób.Usuń w
settings.gradle
ten blok kodu:import org.gradle.api.initialization.resolve.RepositoriesMode dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() } }
Dodaj poniższą zależność do konfiguracji Gradle lub Maven, zastępując Obiekt zastępczy
VERSION_NUMBER
, który wskazuje odpowiednią wersję pakietu Consumer SDK.Gradle
Dodaj do
build.gradle
:dependencies { ... implementation 'com.google.android.libraries.mapsplatform.transportation:transportation-consumer:VERSION_NUMBER' }
Maven
Dodaj do
pom.xml
:<dependencies> ... <dependency> <groupId>com.google.android.libraries.mapsplatform.transportation</groupId> <artifactId>transportation-consumer</artifactId> <version>VERSION_NUMBER</version> </dependency> </dependencies>
Pakiet SDK dla klientów indywidualnych korzysta z pakietu Maps SDK. Ta zależność jest skonfigurowana w taki sposób w taki sposób, że jeśli wersja pakietu Maps SDK nie jest wyraźnie zdefiniowana w pliku konfiguracji kompilacji, jak widać poniżej. SDK dla klientów indywidualnych będzie w dalszym ciągu wykorzystywać minimalne wymagana wersja pakietu SDK Map Google.
Gradle
Dodaj do
build.gradle
:dependencies { ... implementation 'com.google.android.gms:play-services-maps:18.1.0' }
Maven
Dodaj do
pom.xml
:<dependencies> ... <dependency> <groupId>com.google.android.gms</groupId> <artifactId>play-services-maps</artifactId> <version>18.1.0</version> </dependency> </dependencies>
Dodawanie klucza interfejsu API do aplikacji
Po dodaniu do aplikacji pakietu Consumer SDK dodaj do niej klucz interfejsu API. Musisz użyć klucza interfejsu API projektu uzyskanego podczas skonfigurować projekt programistyczny.
W tej sekcji opisano, jak przechowywać klucz interfejsu API w celu zwiększenia jego bezpieczeństwa
przywoływanych przez aplikację. Nie sprawdzaj klucza interfejsu API w swojej wersji
systemu sterowania. Powinien on być zapisany w pliku local.properties
, który jest
znajduje się w katalogu głównym projektu. Więcej informacji na temat
local.properties
, patrz
Pliki właściwości Gradle.
Aby uprościć to zadanie, możesz skorzystać z Wtyczka Gradle obiektów tajnych na Androida.
Aby zainstalować wtyczkę i zapisać klucz interfejsu API:
Otwórz plik
build.gradle
na poziomie głównym i dodaj ten kod do sekcjidependencies
w kolumniebuildscript
.Zakręcony
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") } }
Otwórz plik
build.gradle
na poziomie aplikacji i dodaj ten kod do sekcjiplugins
.Zakręcony
id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
Kotlin
id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin")
Jeśli używasz Androida Studio, zsynchronizować projekt z Gradle.
Otwórz
local.properties
w katalogu na poziomie projektu i dodaj do tego kodu. ZastąpYOUR_API_KEY
swoim kluczem interfejsu API.MAPS_API_KEY=YOUR_API_KEY
W pliku
AndroidManifest.xml
przejdź do sekcjicom.google.android.geo.API_KEY
i zaktualizuj atrybutandroid:value
w następujący sposób:<meta-data android:name="com.google.android.geo.API_KEY" android:value="${MAPS_API_KEY}" />
Ten przykład zawiera pełny plik manifestu przykładowej aplikacji:
<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>
Umieść w aplikacji wymagane informacje o źródłach
Jeśli w swojej aplikacji używasz pakietu SDK dla konsumentów, musisz dołączyć teksty informacji o źródle i licencje open source jako część informacji prawnych dotyczących aplikacji. . Informacje o autorach najlepiej jest dodawać jako niezależną pozycję menu lub jako w menu Informacje.
Informacje o licencjach można znaleźć w pliku „third_party_licenses.txt”. zapisz w niezarchiwizowanego pliku AAR.
Wejdź na https://developers.google.com/android/guides/opensource. jak uwzględniać powiadomienia open source.
Uwierzytelnianie za pomocą pakietu SDK klienta
Pakiet SDK Consumer SDK umożliwia uwierzytelnianie za pomocą tokenów sieciowych JSON. Token internetowy JSON (JWT) to podstawowy token dostępu JSON, który zapewnia lub więcej roszczeń dotyczących usługi. Serwer może na przykład wygenerować token z roszczeniem „zalogował się jako administrator” i dostarczają klientowi. Klient może następnie użyć tego tokena, aby udowodnić, że jest zalogowany jako administrator.
Pakiet SDK klienta korzysta z tokena internetowego JSON udostępnionego przez aplikację komunikacją z Fleet Engine. Więcej informacji znajdziesz w artykule Uwierzytelnianie i autoryzacja Fleet Engine.
Token autoryzacji musi zawierać deklarację tripid:TRIP_ID
w
authorization
, gdzie TRIP_ID
to identyfikator podróży. Dzięki temu konsument
Dostęp pakietu SDK do szczegółów podróży, takich jak pozycja pojazdu, trasa i szacowany czas dotarcia na miejsce.
Wywołania zwrotne tokena internetowego JSON
Pakiet SDK klienta rejestruje wywołanie zwrotne tokena autoryzacji z aplikacją podczas inicjowania. Pakiet SDK wywołuje aplikację aby uzyskać token dla wszystkich żądań sieciowych, które wymagają autoryzacji.
Zdecydowanie zalecamy, aby implementacja wywołania zwrotnego była autoryzowana w pamięci podręcznej
i odświeżać je dopiero po upływie czasu expiry
. Tokeny powinny
być wydawane z godzinną datą ważności.
Wywołanie zwrotne tokena autoryzacji określa wymagany token usługi
dla usługi TripService
. Zapewnia też wymagane tripId
w kontekście.
Poniższy przykładowy kod pokazuje, jak wdrożyć autoryzację wywołanie zwrotne tokena.
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
}
}
}
Inicjowanie interfejsu API
Przed wykonaniem tych procedur zakładamy, że włączona jest opcja odpowiednich usług i pakietu Consumer SDK.
Pobieranie instancji ConsumerApi
Aby można było używać pakietu SDK dla użytkowników indywidualnych, aplikacja musi zostać zainicjowana
ConsumerApi
asynchronicznie. Interfejs API to jedyny system.
Metoda inicjowania zajmuje AuthTokenFactory
. Fabryka produkuje nowe
Tokeny JWT dla użytkownika, gdy jest to konieczne.
providerId
to identyfikator projektu Google Cloud. Zobacz
Przewodnik użytkownika Fleet Engine
.
Aplikacja powinna implementować interfejs AuthTokenFactory
w sposób opisany w
Uwierzytelnianie klienta za pomocą pakietu SDK.
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 i mechanizmy renderowania map
Pakiet Consumer SDK w wersji 2.x.x obsługuje pakiet Maps SDK na Androida w wersji 18.1.0 lub nowszej. Tabela
poniżej podsumowuje domyślny mechanizm renderowania według wersji pakietu SDK Map Google oraz możliwości
obu mechanizmów renderowania. Zalecamy jednak użycie najnowszego mechanizmu renderowania,
z użyciem starszego mechanizmu renderowania, możesz go wyraźnie określić za pomocą
MapsInitializer.initialize()
Wersja pakietu SDK Maps | Obsługuje najnowszy mechanizm renderowania | Obsługuje starszy mechanizm renderowania | Domyślny mechanizm renderowania |
---|---|---|---|
Wersja 18.1.0 i starsze | Tak | Tak | Starsza wersja* |
V18.2.0 | Tak | Tak | Najnowsze |
* Po wdrożeniu nowego mechanizmu renderowania Map, domyślny mechanizm renderowania.
Dodaj pakiet Maps SDK jako zależność
Gradle
Dodaj do build.gradle
:
dependencies {
//...
implementation "com.google.android.gms:play-services-maps:VERSION_NUMBER"
}
Maven
Dodaj do pom.xml
:
<dependencies>
...
<dependency>
<groupId>com.google.android.gms</groupId>
<artifactId>play-services-maps</artifactId>
<version>18.1.0</version>
</dependency>
</dependencies>
Zainicjuj pakiet SDK Maps SDK przed zainicjowaniem pakietu dla klientów indywidualnych
W ramach zajęć Application
lub start-upów Activity
zadzwoń
MapsInitializer.initialize()
i poczekaj na wynik żądania mechanizmu renderowania, zanim zainicjujesz
pakiet SDK dla klientów indywidualnych.
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()
}
})
}
Tworzenie interfejsu użytkownika
Możesz użyć: ConsumerMapFragment
lub
ConsumerMapView
, aby utworzyć interfejs użytkownika
aplikacji. Funkcja ConsumerMapFragment
umożliwia określenie
za pomocą
Fragment
, natomiast ConsumerMapView
umożliwia korzystanie z
View
Wspólne przejazdy
funkcje są takie same zarówno w ConsumerMapView
, jak i
ConsumerMapFragment
, aby wybrać tę usługę na podstawie
czy View
, czy
Fragment
jest lepszy w przypadku Twojej aplikacji.
Dodanie obsługi elementów rysowanych w interfejsie API 19 (KitKat) i wektorowych
Jeśli projekt Twojej aplikacji wymaga obsługi urządzeń z interfejsem API 19 (KitKat) i elementów rysowanych wektorowo,
dodaj następujący kod do swojej aktywności. Ten kod przedłuża się
AppCompatActivity
, aby użyć
Obiekty rysowalne wektorowe w pakiecie SDK dla klientów indywidualnych.
Java
// ...
import android.support.v7.app.AppCompatActivity;
// ...
public class ConsumerTestActivity extends AppCompatActivity {
// ...
}
Kotlin
// ...
import android.support.v7.app.AppCompatActivity
// ...
class ConsumerTestActivity : AppCompatActivity() {
// ...
}
Dodawanie fragmentu lub widoku mapy
Tworzysz mapę do wyświetlania dzielenia się podróżami we fragmencie Androida
lub widoku zdefiniowanego w pliku XML układu aplikacji (znajdujący się w
/res/layout
). Następnie fragment (lub widok) zapewnia dostęp do podróży.
udostępnianie mapy, której aplikacja może używać i modyfikować. Mapa zapewnia też dostęp do funkcji
do interfejsu ConsumerController
, który umożliwia aplikacji kontrolowanie
dostosować środowisko udostępniania.
Udostępnianie mapy i kontrolera
Mapę udostępniania podróży definiuje się jako fragment (za pomocą
ConsumerMapFragment
) lub jako widok (za pomocą ConsumerMapView
), jak pokazano w
poniżej przykładowego kodu. Twoja metoda onCreate()
powinna następnie wywołać
getConsumerGoogleMapAsync(callback)
, która zwraca ConsumerGoogleMap
asynchronicznie w wywołaniu zwrotnym. Następnie możesz użyć funkcji ConsumerGoogleMap
, aby wyświetlić
i można je aktualizować w zależności od potrzeb aplikacji.
ConsumerMapFragment
Definiujesz fragment w pliku XML układu aplikacji, jak pokazano na ten przykładowy kod.
<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" />
Wywołanie funkcji getConsumerGoogleMapAsync()
powinno pochodzić z aplikacji 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
Widok może być używany we fragmencie lub w aktywności, zgodnie z definicją 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" />
Wywołanie getConsumerGoogleMapAsync()
powinno pochodzić z onCreate()
. W
oprócz parametru wywołania zwrotnego wymagany jest element zawierający aktywność lub
fragment i GoogleMapOptions
(który może mieć wartość null), który zawiera konfigurację
dla: MapView
. Klasa bazowa aktywności lub fragmentu musi być albo
FragmentActivity
lub pomocy Fragment
, ponieważ zapewniają
i dostęp do jej cyklu życia.
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,
)
}
}
Pozycja MapView
we fragmencie jest taka sama jak w przykładzie powyżej dla MapView
w
z tą różnicą, że fragment rozszerza układ zawierający
MapView
we fragmencie 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)
}
}
Dostosowywanie powiększenia aparatu w celu skoncentrowania się na podróży
Domyślny przycisk Moja lokalizacja wbudowany w pakiet SDK Map Google kieruje aparat na lokalizację urządzenia.
Jeśli trwa sesja udostępniania trasy, możesz wyśrodkować kamerę aby skupić się na trasie, a nie na lokalizacji urządzenia.
Wbudowany pakiet SDK dla użytkowników urządzeń z Androidem: AutoCamera
Aby umożliwić Ci skupienie się na podróży, a nie na lokalizacji urządzenia, Pakiet SDK dla klientów indywidualnych udostępnia funkcję aparatu automatycznego, domyślnie włączone. Kamera robi zbliżenie, aby skupić się na trasie udostępniania podróży. następny punkt na trasie podróży.
Dostosowywanie działania kamery
Jeśli chcesz mieć większą kontrolę nad działaniem kamery, możesz ją wyłączyć lub włączyć autokamerę za pomocą funkcji ConsumerController.setAutoCameraEnabled().
ConsumerController.getCameraUpdate() zwraca w danym momencie zalecane wartości progowe kamery. Możesz następnie podać ten element CameraUpdate
jako argument dla
GoogleMap.moveCamera() lub GoogleMap.animateCamera().
Korzystaj ze wspólnych przejazdów i map
Aby obsługiwać wspólne przejazdy i interakcję z mapą w aplikacji, musisz mieć dostęp
do: ConsumerGoogleMap
i
ConsumerController
ConsumerMapFragment
i
ConsumerMapView
zwracają asynchronicznie
ConsumerGoogleMap
w: ConsumerMapReadyCallback
.
ConsumerGoogleMap
za możliwość zwrotu
ConsumerController
od: getConsumerController()
. Ty
ma dostęp do ConsumerGoogleMap
i
ConsumerController
w następujący sposób.
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
to klasa kodu dla tagu
GoogleMap
zajęcia. Dzięki niemu aplikacja może:
interakcji z mapą za pomocą interfejsu API równoważnego
GoogleMap
Korzystanie z mapy konsumenta umożliwia aplikacji i korzystanie z transportu
co umożliwia płynną interakcję z tą samą bazową mapą Google. Przykład:
GoogleMap
umożliwia rejestrację tylko z jednym wywołaniem zwrotnym, ale
ConsumerGoogleMap
obsługuje podwójne zarejestrowane wywołania zwrotne.
Te wywołania zwrotne pozwalają aplikacji i udostępnianiu przejazdów rejestrować wywołania zwrotne, które są
są wywoływane sekwencyjnie.
ConsumerController
ConsumerController
umożliwia dostęp do funkcji wspólnych przejazdów, takich jak
takich jak monitorowanie podróży, kontrolowanie ich stanu
i ustawianie lokalizacji.
Konfigurowanie udostępniania podróży
Gdy backend dopasuje klienta do pojazdu, użyj funkcji JourneySharingSession
aby rozpocząć korzystanie z interfejsu Udostępniania podróży. Udostępnianie serii wyświetla dopasowane
lokalizację i trasę pojazdu. Po zaimplementowaniu pakietu SDK w aplikacji możesz dodać
funkcje monitorowania podróży, nasłuchiwania aktualizacji i obsługi błędów.
W poniższych procedurach zakładamy, że usługi backendu są dostępne i że
usługi dopasowywania pojazdów do klientów.
Zarejestruj detektor w obiekcie
TripModel
, aby uzyskać szczegółowe informacje o informacje o podróży, takie jak szacowany czas przyjazdu (szacowany czas przyjazdu) i odległość; który pojazd musi przejechać przed przyjazdem.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?, ) { // ... } // ... })
Skonfiguruj podróż w aplikacji
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)
Przestań udostępniać trasę
Pamiętaj, aby zatrzymać udostępnianie ścieżek, gdy nie jest już potrzebne, na przykład w przypadku zniszczenia aktywności hosta. Zatrzymanie udostępniania ścieżek powoduje też zatrzymanie żądań sieciowych wysyłanych do Fleet Engine i zapobiega wyciekom pamięci.
Ten przykładowy kod pokazuje, jak zatrzymać udostępnianie przebiegu.
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()
}
}
Obsługa błędów związanych z podróżą
Metoda onTripRefreshError
wyświetla błędy, które występują podczas monitorowania podróży.
Mapowanie pakietu SDK klienta
są zgodne z wytycznymi HTTP/RPC co
Google Cloud Platform
Typowe błędy wykrywane podczas monitorowania podróży to między innymi:
HTTP | RPC | Opis |
---|---|---|
400 | NIEPRAWIDŁOWY_ARG | Klient podał nieprawidłową nazwę podróży.
nazwa podróży musi mieć format
providers/{provider_id}/trips/{trip_id}
Wartość provider_id musi być identyfikatorem
Projekt Cloud należący do dostawcy usług. |
401 | BEZ UWIERZYTELNIANIA | Żądanie nie zostało uwierzytelnione z powodu nieprawidłowy token JWT. Ten błąd wystąpi jeśli token JWT jest podpisany bez podróży identyfikator lub token JWT wygasł. |
403 | PERMISSION_DENIED | Klient nie ma wystarczających uprawnienia. Ten błąd występuje, jeśli token JWT token jest nieprawidłowy, klient nie ma uprawnienia lub interfejs API jest wyłączony dla z projektem klienta. Token JWT może być brakuje lub token jest podpisany podróżą identyfikator, który nie pasuje do żądanego identyfikatora podróży. |
429 | RESOURCE_EXHAUSTED | Limit zasobów wynosi zero lub wynosi częstotliwość przekracza limit. |
503 | PRODUKT NIEDOSTĘPNY | Usługa niedostępna Zwykle serwer spadła. |
504 | DEADLINE_EXCEEDED | Przekroczono termin prośby. Dzięki temu ma miejsce tylko wtedy, gdy rozmówca ustawi termin która jest krótsza niż domyślna metody terminu (tzn. wskazany termin nie tyle, aby serwer przetworzył ), a prośba nie została zrealizowana w wyznaczonym terminie. |
Więcej informacji: Obsługa błędów pakietu SDK klienta.