İsteğe Bağlı Yolculuklar ve Teslimatlar Çözümü arka uç hizmetleriyle entegre temel bir tüketici uygulaması derleyip çalıştırmak için Tüketici SDK'sını kullanabilirsiniz. Aktif bir geziyi gösterebilen, gezi güncellemelerine yanıt verebilen ve gezi hatalarını işleyebilen bir Seyahat ve Sipariş İlerlemesi uygulaması oluşturabilirsiniz.
Consumer SDK'nın modüler bir mimarisi olduğundan API'nin belirli bir uygulamanız için kullanmak istediğiniz bölümlerini kullanabilir ve bunları kendi API'lerinizle, Fleet Engine tarafından sağlanan arka uç hizmetleriyle ve Google Haritalar Platformu'ndaki ek API'lerle entegre edebilirsiniz.
Minimum sistem gereksinimleri
Mobil cihazda Android 6.0 (API düzeyi 23) veya sonraki sürümler yüklü olmalıdır.
Derleme ve bağımlılık yapılandırması
Tüketici SDK'sı 1.99.0 ve sonraki sürümleri, Google Maven deposu kullanılarak kullanılabilir. Daha önce kullanılan özel depo kanalı kullanımdan kaldırıldı.
Gradle
build.gradle
dosyanıza aşağıdakileri ekleyin:
repositories {
...
google()
}
Maven
pom.xml
dosyanıza aşağıdakileri ekleyin:
<project>
...
<repositories>
<repository>
<id>google-maven-repository</id>
<url>https://maven.google.com</url>
</repository>
</repositories>
...
</project>
Proje Yapılandırması
Android için Tüketici SDK'sını kullanmak istiyorsanız uygulamanızın minSdkVersion
23 veya sonraki bir sürümü hedeflemesi gerekir.
Tüketici SDK'sı ile oluşturulmuş bir uygulamayı çalıştırmak için Android cihazda Google Play Hizmetleri yüklü olmalıdır.
Geliştirme projenizi oluşturun
Geliştirme projenizi oluşturmak ve Google Cloud Console'da projenize ait bir API anahtarı almak için:
Tüketici SDK'sı ile kullanılacak yeni bir Google Cloud Console projesi oluşturun veya mevcut bir projeyi seçin. Yeni proje Google Cloud Console'da görünene kadar birkaç dakika bekleyin.
Demo uygulamayı çalıştırmak istiyorsanız projenizin Android için Haritalar SDK'sına erişimi olmalıdır. Google Cloud Console'da API'ler ve Hizmetler > Kitaplık'ı seçin ve ardından Android için Haritalar SDK'sını bulup etkinleştirin.
API'ler ve Hizmetler > Kimlik bilgileri > Kimlik bilgisi oluştur > API anahtarı'nı seçerek proje için bir API anahtarı alın. API anahtarı alma hakkında daha fazla bilgi için API anahtarı alma bölümüne bakın.
Tüketici SDK'sını uygulamanıza ekleyin
Tüketici SDK'sı özel bir Maven deposu üzerinden kullanılabilir. Depo, SDK'nın Proje Nesne Modeli (.pom) dosyalarını ve Javadocs'larını içerir. Tüketici SDK'sını uygulamanıza eklemek için:
Ortamınızı, önceki bölümde açıklandığı gibi ana makine Maven deposuna erişecek şekilde ayarlayın.
settings.gradle
içinde beyan edilmiş merkezi bağımlılık yönetimi yapılandırmanızı varsa aşağıdaki şekilde devre dışı bırakın.settings.gradle
ürününde aşağıdaki kod bloğunu kaldırın:import org.gradle.api.initialization.resolve.RepositoriesMode dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() } }
Aşağıdaki bağımlılığı Gradle veya Maven yapılandırmanıza ekleyerek
VERSION_NUMBER
yer tutucusunu Tüketici SDK'sının istediğiniz sürümü ile değiştirin.Gradle
build.gradle
cihazınıza şunları ekleyin:dependencies { ... implementation 'com.google.android.libraries.mapsplatform.transportation:transportation-consumer:VERSION_NUMBER' }
Maven
pom.xml
cihazınıza şunları ekleyin:<dependencies> ... <dependency> <groupId>com.google.android.libraries.mapsplatform.transportation</groupId> <artifactId>transportation-consumer</artifactId> <version>VERSION_NUMBER</version> </dependency> </dependencies>
Tüketici SDK'sı, Haritalar SDK'sına bağlıdır. Bu bağımlılık, Haritalar SDK'sı sürümü derleme yapılandırma dosyasında aşağıdaki gibi açıkça tanımlanmamışsa, Haritalar SDK'sının yeni bir sürümü yayınlandığında, Tüketici SDK'sının gerektirdiği minimum desteklenen Haritalar SDK sürümünü kullanmaya devam edeceği şekilde yapılandırılır.
Gradle
build.gradle
cihazınıza şunları ekleyin:dependencies { ... implementation 'com.google.android.gms:play-services-maps:18.1.0' }
Maven
pom.xml
cihazınıza şunları ekleyin:<dependencies> ... <dependency> <groupId>com.google.android.gms</groupId> <artifactId>play-services-maps</artifactId> <version>18.1.0</version> </dependency> </dependencies>
API anahtarını uygulamanıza ekleyin
Tüketici SDK'sını uygulamanıza ekledikten sonra API anahtarını uygulamanıza ekleyin. Geliştirme projenizi oluştururken edindiğiniz proje API anahtarını kullanmanız gerekir.
Bu bölümde, uygulamanız tarafından daha güvenli bir şekilde referans verilebilmesi için API anahtarınızı nasıl depolayacağınız açıklanmaktadır. API anahtarınızı sürüm kontrol sisteminize kontrol etmemelisiniz. Projenizin kök dizininde bulunan local.properties
dosyasında depolanmalıdır. local.properties
dosyası hakkında daha fazla bilgi için Gradle özellikleri dosyaları bölümüne bakın.
Bu görevi kolaylaştırmak için Android için Secrets Gradle Eklentisi'ni kullanabilirsiniz.
Eklentiyi yüklemek ve API anahtarınızı saklamak için:
Kök düzeyindeki
build.gradle
dosyanızı açın ve aşağıdaki kodubuildscript
altındakidependencies
öğesine ekleyin.Modern
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") } }
Uygulama düzeyindeki
build.gradle
dosyanızı açın veplugins
öğesine aşağıdaki kodu ekleyin.Modern
id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
Kotlin
id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin")
Android Studio kullanıyorsanız projenizi Gradle ile senkronize edin.
Proje düzeyindeki dizinde
local.properties
dosyasını açın ve aşağıdaki kodu ekleyin.YOUR_API_KEY
kısmını API anahtarınızla değiştirin.MAPS_API_KEY=YOUR_API_KEY
AndroidManifest.xml
dosyanızdacom.google.android.geo.API_KEY
adresine gidin veandroid:value
özelliğini aşağıdaki şekilde güncelleyin:<meta-data android:name="com.google.android.geo.API_KEY" android:value="${MAPS_API_KEY}" />
Aşağıdaki örnekte, örnek bir uygulama için eksiksiz bir manifest gösterilmektedir:
<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>
Uygulamanıza gerekli ilişkilendirmeleri dahil edin
Uygulamanızda Tüketici SDK'sını kullanıyorsanız uygulamanızın yasal uyarılar bölümünün bir parçası olarak ilişkilendirme metni ve açık kaynak lisansları eklemeniz gerekir. İlişkilendirmeleri bağımsız bir menü öğesi veya bir Hakkında menü öğesinin parçası olarak eklemek en iyisidir.
Lisans bilgileri, arşivden çıkarılmış AAR dosyasındaki "third_party_LICENSEs.txt" dosyasında bulunabilir.
Açık kaynak bildirimlerini nasıl ekleyeceğinizi öğrenmek için https://developers.google.com/android/guides/opensource adresine bakın.
Tüketici SDK'sı Kimlik Doğrulaması
Tüketici SDK'sı, JSON Web Jetonları kullanarak kimlik doğrulama sağlar. JSON Web Token (JWT), bir hizmette bir veya daha fazla hak talebi sağlayan JSON tabanlı bir erişim jetonudur. Örneğin, bir sunucu "yönetici olarak giriş yapıldı" iddiasını içeren bir jeton oluşturabilir ve bunu istemciye sağlayabilir. Daha sonra istemci, bu jetonu kullanarak hesabın yönetici olarak giriş yaptığını kanıtlayabilir.
Tüketici SDK'sı, Fleet Engine ile iletişim kurmak için uygulama tarafından sağlanan JSON Web Token'ı kullanır. Daha fazla bilgi için Fleet Engine Kimlik Doğrulaması ve Yetkilendirmesi bölümüne bakın.
Yetkilendirme jetonu, jetonun authorization
başlığında bir tripid:TRIP_ID
talebi içermelidir. Burada TRIP_ID
, gezi kimliğidir. Bu sayede Tüketici SDK'sı araç konumu, rota ve TVS gibi gezi ayrıntılarına erişebilir.
JSON Web Jetonu geri çağırmaları
Tüketici SDK'sı, başlatma sırasında uygulamaya bir yetkilendirme jetonu geri çağırması kaydeder. SDK, yetkilendirme gerektiren tüm ağ istekleri için bir jeton almak üzere uygulamayı çağırır.
Geri çağırma uygulamanızın önbellek yetkilendirme jetonlarını kullanmanızı ve bunları yalnızca expiry
süresi dolduğunda yenilemenizi önemle tavsiye ederiz. Jetonlar, bir saatlik geçerlilik süresiyle verilmelidir.
Yetkilendirme jetonu geri çağırması, TripService
hizmeti için hangi hizmet jetonunun gerekli olduğunu belirtir. Ayrıca bağlam için gerekli tripId
değerini de sağlar.
Aşağıdaki kod örneği, yetkilendirme jetonu geri çağırmasının nasıl uygulanacağını gösterir.
Java
class JsonAuthTokenFactory implements AuthTokenFactory {
private static final String TOKEN_URL =
"https://yourauthserver.example/token";
private static class CachedToken {
String tokenValue;
long expiryTimeMs;
String tripId;
}
private CachedToken token;
/*
* This method is called on a background thread. Blocking is OK. However, be
* aware that no information can be obtained from Fleet Engine until this
* method returns.
*/
@Override
public String getToken(AuthTokenContext context) {
// If there is no existing token or token has expired, go get a new one.
String tripId = context.getTripId();
if (tripId == null) {
throw new RuntimeException("Trip ID is missing from AuthTokenContext");
}
if (token == null || System.currentTimeMillis() > token.expiryTimeMs ||
!tripId.equals(token.tripId)) {
token = fetchNewToken(tripId);
}
return token.tokenValue;
}
private static CachedToken fetchNewToken(String tripId) {
String url = TOKEN_URL + "/" + tripId;
CachedToken token = new CachedToken();
try (Reader r = new InputStreamReader(new URL(url).openStream())) {
com.google.gson.JsonObject obj
= com.google.gson.JsonParser.parseReader(r).getAsJsonObject();
token.tokenValue = obj.get("ServiceToken").getAsString();
token.expiryTimeMs = obj.get("TokenExpiryMs").getAsLong();
/*
* The expiry time could be an hour from now, but just to try and avoid
* passing expired tokens, we subtract 5 minutes from that time.
*/
token.expiryTimeMs -= 5 * 60 * 1000;
} catch (IOException e) {
/*
* It's OK to throw exceptions here. The error listeners will receive the
* error thrown here.
*/
throw new RuntimeException("Could not get auth token", e);
}
token.tripId = tripId;
return token;
}
}
Kotlin
class JsonAuthTokenFactory : AuthTokenFactory() {
private var token: CachedToken? = null
/*
* This method is called on a background thread. Blocking is OK. However, be
* aware that no information can be obtained from Fleet Engine until this
* method returns.
*/
override fun getToken(context: AuthTokenContext): String {
// If there is no existing token or token has expired, go get a new one.
val tripId =
context.getTripId() ?:
throw RuntimeException("Trip ID is missing from AuthTokenContext")
if (token == null || System.currentTimeMillis() > token.expiryTimeMs ||
tripId != token.tripId) {
token = fetchNewToken(tripId)
}
return token.tokenValue
}
class CachedToken(
var tokenValue: String? = "",
var expiryTimeMs: Long = 0,
var tripId: String? = "",
)
private companion object {
const val TOKEN_URL = "https://yourauthserver.example/token"
fun fetchNewToken(tripId: String) {
val url = "$TOKEN_URL/$tripId"
val token = CachedToken()
try {
val reader = InputStreamReader(URL(url).openStream())
reader.use {
val obj = com.google.gson.JsonParser.parseReader(r).getAsJsonObject()
token.tokenValue = obj.get("ServiceToken").getAsString()
token.expiryTimeMs = obj.get("TokenExpiryMs").getAsLong()
/*
* The expiry time could be an hour from now, but just to try and avoid
* passing expired tokens, we subtract 5 minutes from that time.
*/
token.expiryTimeMs -= 5 * 60 * 1000
}
} catch (e: IOException) {
/*
* It's OK to throw exceptions here. The error listeners will receive the
* error thrown here.
*/
throw RuntimeException("Could not get auth token", e)
}
token.tripId = tripId
return token
}
}
}
API'yi başlatma
Bu prosedürleri uygulamadan önce, uygun hizmetleri ve Tüketici SDK'sını etkinleştirdiğiniz varsayılır.
ConsumerApi
örneğini alın
Tüketici SDK'sını kullanmak için uygulamanızın ConsumerApi
eşzamansız olarak başlatılması gerekir. API tek bir API'dir.
Başlatma yöntemi AuthTokenFactory
sürer. Fabrika, gerektiğinde kullanıcı için yeni JWT jetonları oluşturur.
providerId
, Google Cloud projenizin proje kimliğidir. Proje oluşturma hakkında daha fazla bilgi için Fleet Engine Kullanıcı Kılavuzu'na bakın.
Uygulamanız, AuthTokenFactory
öğesini Tüketici SDK'sı Kimlik Doğrulaması bölümünde açıklandığı şekilde uygulamalıdır.
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
}
Haritalar SDK'sı ve harita oluşturucuları
Tüketici SDK'sı v2.x.x sürümü, Android 18.1.0 ve üzeri sürümler için Haritalar SDK'sını destekler. Aşağıdaki tabloda, Haritalar SDK'sı sürümüne göre varsayılan oluşturucu ve her iki oluşturucunun desteklenebilirliği özetlenmektedir. En son oluşturucuyu kullanmanızı öneririz, ancak eski oluşturucuyu kullanmanız gerekiyorsa MapsInitializer.initialize()
kullanarak bunu açıkça belirtebilirsiniz.
Haritalar SDK'sı sürümü | En son oluşturucuyu destekliyor | Eski oluşturucuyu destekler | Varsayılan oluşturucu |
---|---|---|---|
V18.1.0 ve önceki sürümler | Evet | Evet | Eski* |
V18.2.0 | Evet | Evet | Son yüklenenler |
* Yeni Haritalar Oluşturucu'nun kullanıma sunulmasıyla birlikte, En son oluşturucu varsayılan olarak kullanılacaktır.
Bağımlılık olarak Haritalar SDK'sı ekleme
Gradle
build.gradle
cihazınıza şunları ekleyin:
dependencies {
//...
implementation "com.google.android.gms:play-services-maps:VERSION_NUMBER"
}
Maven
pom.xml
cihazınıza şunları ekleyin:
<dependencies>
...
<dependency>
<groupId>com.google.android.gms</groupId>
<artifactId>play-services-maps</artifactId>
<version>18.1.0</version>
</dependency>
</dependencies>
Tüketici SDK'sını başlatmadan önce Haritalar SDK'sını başlatın
Application
veya başlangıç Activity
sınıfınızda, Tüketici SDK'sını başlatmadan önce MapsInitializer.initialize() işlevini çağırın ve oluşturucu istek sonucunu bekleyin.
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()
}
})
}
Kullanıcı Arayüzünü Oluşturma
Uygulamanızın kullanıcı arayüzünü oluşturmak için ConsumerMapFragment
veya ConsumerMapView
kullanabilirsiniz. ConsumerMapFragment
, haritanızı Fragment
kullanarak tanımlamanıza olanak tanırken ConsumerMapView
, View
kullanmanıza olanak tanır. Yolculuk paylaşımı işlevi hem ConsumerMapView
hem de ConsumerMapFragment
ürününde aynıdır. Bu nedenle, View
veya Fragment
arasından hangisinin daha iyi olduğuna bağlı olarak birini seçebilirsiniz.
API 19 (KitKat) ve Vector çekilebilir öğeleri için destek
Uygulamanızın tasarımı için API 19 (KitKat) cihazlar ve vektör çekilebilir öğeleri için destek gerekiyorsa aşağıdaki kodu Etkinliğinize ekleyin. Bu kodlar, Tüketici SDK'sında Vektör çekilebilir noktalarını kullanmak için AppCompatActivity
öğesini genişletir.
Java
// ...
import android.support.v7.app.AppCompatActivity;
// ...
public class ConsumerTestActivity extends AppCompatActivity {
// ...
}
Kotlin
// ...
import android.support.v7.app.AppCompatActivity
// ...
class ConsumerTestActivity : AppCompatActivity() {
// ...
}
Harita parçasını veya görünümü ekleme
Yolculuk paylaşımını, uygulama düzeni XML dosyanızda (/res/layout
içinde bulunur) tanımladığınız bir Android parçası veya görünümde
göstermek için harita oluşturursunuz. Parça (veya görünüm), uygulamanızın erişip değiştirebileceği yolculuk paylaşımı haritasına erişim
sağlar. Harita, uygulamanızın yolculuk paylaşımı deneyimini kontrol etmesine ve özelleştirmesine olanak tanıyan ConsumerController
için bir tutma yeri de sağlar.
Yolculuk paylaşımı haritası ve denetleyici
Aşağıdaki kod örneğinde gösterildiği gibi yolculuk paylaşımı haritasını bir parça (ConsumerMapFragment
kullanarak) veya görünüm (ConsumerMapView
kullanarak) olarak tanımlarsınız. Bu durumda onCreate()
yönteminiz, geri çağırmada eşzamansız olarak ConsumerGoogleMap
değeri döndüren getConsumerGoogleMapAsync(callback)
yöntemini çağırır. Daha sonra, yolculuk paylaşımını göstermek için ConsumerGoogleMap
kullanabilirsiniz. Bu bilgi, uygulamanız tarafından gerektiğinde güncellenebilir.
ConsumerMapFragment
Aşağıdaki kod örneğinde gösterildiği gibi, uygulama düzeni XML dosyanızda parçayı tanımlarsınız.
<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" />
getConsumerGoogleMapAsync()
çağrısı, onCreate()
yönteminden gelmelidir.
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
Görünüm, XML dosyanızda tanımlandığı gibi bir parçada veya bir etkinlikte kullanılabilir.
<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" />
getConsumerGoogleMapAsync()
numaralı telefona yapılacak arama onCreate()
olacaktır. Geri çağırma parametresine ek olarak, içeren etkinlik veya parça ile GoogleMapOptions
(boş olabilir) ve MapView
için yapılandırma özelliklerini içerir. Etkinlik veya parça temel sınıfı, kendi yaşam döngüsüne erişim sağladığı için FragmentActivity
ya da destek Fragment
(sırasıyla) olmalıdır.
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,
)
}
}
Bir parçadaki MapView
, bir etkinlikteki MapView
için yukarıdaki örnekle aynıdır ancak parça, onCreateView()
parçası yöntemindeki MapView
öğesini içeren düzeni şişirir.
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)
}
}
Bir yolculuğa odaklanmak için kameranın yakınlaştırmasını ayarlama
Haritalar SDK'sında yerleşik olarak bulunan varsayılan Konumum düğmesi, kamerayı cihaz konumuna göre ortalar.
Etkin bir yolculuk paylaşımı oturumu varsa kamerayı ortalayarak cihazın konumu yerine yolculuğa odaklanmanızı öneririz.
Yerleşik Android çözümü için Tüketici SDK'sı: AutoKamera
Tüketici SDK'sı, cihaz konumu yerine yola odaklanmanız için varsayılan olarak etkinleştirilen bir AutoKamera özelliği sağlar. Kamera, yolculuk paylaşımı rotasına ve sonraki gezi ara noktasına odaklanmak için yakınlaştırılır.
Kamera davranışını özelleştirme
Kamera davranışı üzerinde daha fazla kontrole ihtiyacınız varsa ConsumerController.setAutoCameraEnabled() işlevini kullanarak otomatik kamerayı devre dışı bırakabilir veya etkinleştirebilirsiniz.
ConsumerController.getCameraUpdate(), önerilen kamera sınırlarını döndürür. Daha sonra bu CameraUpdate
öğesini, GoogleMap.moveCamera() veya GoogleMap.animateCamera() işlevi için bir bağımsız değişken olarak sağlayabilirsiniz.
Araç paylaşımına ve haritalara erişme
Uygulamanızda araç paylaşımı ve harita etkileşimini desteklemek için ConsumerGoogleMap
ve ConsumerController
erişiminiz olmalıdır.
ConsumerMapFragment
ve ConsumerMapView
eşzamansız olarak ConsumerGoogleMap
değerini ConsumerMapReadyCallback
içinde döndürür.
ConsumerGoogleMap
, getConsumerController()
mağazasından ConsumerController
tutarında iade yaptı. ConsumerGoogleMap
ve ConsumerController
hizmetlerine aşağıdaki şekilde erişebilirsiniz.
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
, GoogleMap
sınıfı için bir sarmalayıcı sınıfıdır. Uygulamanızın GoogleMap
'a eş değer bir API kullanarak haritayla etkileşim kurmasına olanak tanır. Tüketici haritasını kullanmak, uygulamanızın ve araç paylaşımınızın, aynı temel Google Haritası ile sorunsuz bir şekilde etkileşimde bulunmasını sağlar. Örneğin, GoogleMap
yalnızca tek bir geri arama kaydına izin verir ancak ConsumerGoogleMap
çift kayıtlı geri çağırmayı destekler.
Bu geri çağırma işlevleri, uygulamanızın ve araç paylaşımınızın sıralı olarak çağrılan geri çağırmaları kaydetmesine olanak tanır.
ConsumerController
ConsumerController
, seyahatleri izleme, gezi durumunu kontrol etme ve konum ayarlama gibi araç paylaşma işlevlerine erişim sağlar.
Yolculuk paylaşımını ayarlayın
Arka uç, tüketiciyi bir araçla eşleştirdikten sonra yolculuk paylaşımı kullanıcı arayüzünü başlatmak için JourneySharingSession
öğesini kullanın. Yolculuk paylaşımında, eşleşen araç
konumu ve rota gösterilir. SDK'yı uygulamanıza uyguladıktan sonra gezileri izleme, güncellemeleri dinleme ve hataları ele alma işlevlerini ekleyebilirsiniz.
Aşağıdaki prosedürlerde arka uç hizmetlerinin yürürlükte olduğu ve tüketicileri araçlarla eşleştirme hizmetlerinizin çalışır durumda olduğu varsayılır.
TVS (Tahmini Varış Zamanı) ve aracın varıştan önce kat etmesi gereken mesafe gibi seyahatle ilgili ayrıntıları almak için
TripModel
nesnesine bir dinleyici kaydedin.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?, ) { // ... } // ... })
TripModelOptions
kullanarak gezinizi yapılandırın.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)
Yolculuk paylaşımını durdur
Artık ihtiyaç duyulmadığında (ör. düzenleyen kullanıcının kaldırılması gibi) yolculuk paylaşımını durdurduğunuzdan emin olun. Yolculuk paylaşımının durdurulması, Fleet Engine'e yapılan ağ isteklerini de durdurur ve bellek sızıntılarını önler.
Aşağıdaki örnek kod, yolculuk paylaşımının nasıl durdurulacağını gösterir.
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()
}
}
Gezi hatalarını işleme
onTripRefreshError
yöntemi, gezi izleme sırasında oluşan hataları gösterir.
Tüketici SDK'sı hatalarının eşlemesi Google Cloud Platform için oluşturulan aynı HTTP/RPC yönergelerine uyun.
Gezi izleme sırasında sıklıkla karşılaşılan hatalar şunlardır:
HTTP | RPC | Açıklama |
---|---|---|
400 | INVALID_ARGUMENT | Müşteri, geçersiz bir gezi adı belirtti. Gezi adı providers/{provider_id}/trips/{trip_id} biçiminde olmalıdır.
provider_id, servis sağlayıcının sahip olduğu Cloud Projesi'nin kimliği olmalıdır. |
401 | KİMLİK DOĞRULAMADI | Geçersiz bir JWT jetonu nedeniyle isteğin kimliği doğrulanamadı. JWT jetonu seyahat kimliği olmadan imzalanırsa veya JWT jetonunun süresi dolmuşsa bu hata oluşur. |
403 | PERMISSION_DENIED | İstemci yeterli izne sahip değildir. Bu hata, JWT jetonu geçersizse, istemcinin izni yoksa veya API, istemci projesi için etkinleştirilmemişse ortaya çıkar. JWT jetonu eksik olabilir veya jeton, istenen gezi kimliğiyle eşleşmeyen bir gezi kimliği ile imzalanmış olabilir. |
429 | RESOURCE_EXHAUSTED | Kaynak kotası sıfırdır veya trafik hızı sınırı aşıyordur. |
503 | UNAVAILABLE | Hizmet kullanılamıyor. Genellikle sunucu kapalıdır. |
504 | DEADLINE_EXCEEDED | İstek son tarihi aşıldı. Bu durum yalnızca çağrıyı yapan kişi, yöntemin varsayılan son tarihinden daha kısa bir son tarih belirlerse (yani istenen son tarih, sunucunun isteği işlemesi için yeterli değilse) ve istek son tarih içinde tamamlanmamışsa gerçekleşir. |
Daha fazla bilgi için Tüketici SDK'sı Hatalarını Giderme bölümüne bakın.