Tüketici SDK'sını kullanarak temel bir tüketici uygulaması geliştirip çalıştırabilirsiniz: İsteğe Bağlı Yolculuklar ve Teslimatlar Çözümü arka uç hizmetleriyle entegredir. Proje bilgilerini bir Gezi ve Sipariş İlerlemesi uygulaması, ve gezi güncellemelerini yapın.
Tüketici SDK'sının modüler bir mimarisi olduğu için entegre etmek için kullanabileceğiniz bir API'ye ihtiyacınız var. API'leriniz, Fleet Engine tarafından sağlanan arka uç hizmetleri ve Google Maps Platform'un gelişmiş API'lerini kullanıma sunduk.
Minimum sistem gereksinimleri
Mobil cihazda Android yüklü olmalıdır. 6,0 (API düzeyi 23) veya üzeri.
Derleme ve bağımlılık yapılandırması
Tüketici SDK'sı 1.99.0 ve sonraki sürümleri Google Maven kullanılarak kullanılabilir depodur. 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 sürümler.
Android, Consumer SDK ile oluşturulmuş bir uygulamayı çalıştırmak için cihazda şunlar olmalıdır: Google Play Hizmetleri yüklendi.
Geliştirme projenizi oluşturun
Geliştirme projenizi oluşturmak ve API anahtarı almak için Google Cloud Console'da projeniz için:
Kullanmak için yeni bir Google Cloud Console projesi oluşturun veya mevcut bir projeyi seçin . Birkaç dakika bekleyin. Google Cloud Console'da görünür olduğundan emin olun.
Demo uygulamayı çalıştırmak için projenizin Haritalar SDK'sına erişimi olmalıdır Android için. Google Cloud Console'da aşağıdakilerden birini seçin: API'ler ve Hizmetler > Kitaplık'ı tıklayın, ardından şunun için Haritalar SDK'sını arayın: Android
Şu seçeneği belirleyerek proje için bir API anahtarı alın: API'ler ve Hizmetler > Kimlik Bilgileri > Kimlik bilgileri oluştur > API anahtarı. API anahtarı alma hakkında daha fazla bilgi için bkz. API anahtarı alın.
Tüketici SDK'sını uygulamanıza ekleyin
Tüketici SDK'sı özel bir Maven deposu üzerinden kullanılabilir. İlgili içeriği oluşturmak için kullanılan deposu, SDK'nın Proje Nesne Modeli (.pom) dosyalarını ve Javadocs'u içerir. Tüketici SDK'sını uygulamanıza eklemek için:
Ortamınızı, ana makine Maven deposuna erişecek şekilde ayarlayın. Bunun için aşağıdaki adımları uygulayın: geri dönüp bakarsınız.
Şurada beyan edilen merkezi bağımlılık yönetimi yapılandırmanızı varsa:
settings.gradle
, aşağıdaki gibi 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 ekleyin. Tüketici SDK'sının istenen sürümü için
VERSION_NUMBER
yer tutucusu.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 Bu şekilde, Haritalar SDK'sının sürümü açıkça belirtilen şekilde tanımlanmamışsa, Haritalar'ın yeni bir sürümü yüklendiğinde aşağıdaki gibi bir derleme yapılandırma dosyası SDK yayınlandı. Tüketici SDK'sı şunu kullanmaya devam edecek desteklenen Google Haritalar SDK sürümü gerekir.
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şturun.
Bu bölümde, daha güvenli olması için API anahtarınızı nasıl depolayacağınız açıklanmaktadır.
veya üçüncü taraf uygulamadır. Sürümünüzde API anahtarınızı kontrol etmemelisiniz
kontrol sistemi. Bu veriler, local.properties
dosyasında depolanmalıdır.
klasörünün herhangi bir bölümünde bulunur. Daha fazla bilgi için
local.properties
dosyası için bkz.
Gradle özellikleri dosyaları.
Bu görevi kolaylaştırmak için Android için Secrets Gradle Plugin.
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ındadependencies
öğesi.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 ve aşağıdaki koduplugins
öğesi.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 kullanabilirsiniz.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 şu ş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ı kullanıyorsanız şunu eklemelisiniz: uygulamanızın yasal uyarılarının bir parçası olarak atıf metni ve açık kaynak lisansları bölümüne ekleyin. İlişkilendirmeleri bağımsız bir menü öğesi veya her zaman bir Hakkında menü öğesinin bir bölümüdür.
Lisans bilgileri "third_party_LICENSEs.txt" dosyasında bulunabilir şurada dosyala: arşivden çıkarılan AAR dosyasına dokunun.
https://developers.google.com/android/guides/opensource konusunda daha fazla bilgi edinin.
Tüketici SDK'sı Kimlik Doğrulaması
Tüketici SDK'sı, JSON Web Jetonları kullanarak kimlik doğrulama sağlar. JSON Web Token (JWT), JSON tabanlı bir erişim jetonudur ve hak talebi veya daha fazla talebiniz olabilir. Örneğin, bir sunucu "giriş, yönetici olarak giriş yapıldı" iddiasına sahip bir jeton ve tüm bunların teslim etmek anlamına gelir. Müşteri daha sonra bu jetonu kullanarak yönetici olarak giriş yapıldı.
Tüketici SDK'sı, uygulama tarafından sağlanan JSON Web Jetonu'nu kullanır Fleet Engine ile iletişim kurmak için idealdir. Daha fazla bilgi için Fleet Engine Kimlik Doğrulaması ve Yetkilendirmesi bölümüne bakın.
Yetkilendirme jetonunun jetonunda bir tripid:TRIP_ID
talebi bulunmalıdır
authorization
üstbilgisi; burada TRIP_ID
, gezi kimliğidir. Bu, tüketicinin
Araç konumu, rota ve TVS dahil olmak üzere gezi ayrıntılarına SDK erişimi.
JSON Web Jetonu geri çağırmaları
Tüketici SDK'sı bir yetkilendirme jetonu geri çağırması kaydeder ilk kullanıma hazırlama sırasında uygulamayla birlikte yürütülür. SDK, uygulamayı çağırır kullanarak yetkilendirme gerektiren tüm ağ istekleri için bir jeton alabilirsiniz.
Geri çağırma uygulamanızın önbellek yetkilendirmesini kullanmanızı
jetonları yenilemeli ve bunları yalnızca expiry
zamanı geçtiğinde yenilemelidir. Jetonlar
bir saatlik son geçerlilik tarihi olmalıdır.
Yetkilendirme jetonu geri çağırması hangi hizmet jetonunun gerektiğini belirtir
TripService
hizmeti için. Ayrıca gerekli tripId
daha iyi anlamanızı sağlar.
Aşağıdaki kod örneği, bir yetkilendirmenin nasıl uygulanacağını gösterir jeton geri çağırması.
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ürler uygulanmadan önce ve Tüketici SDK'sını kullanabilirsiniz.
ConsumerApi
örneğini alın
Tüketici SDK'sını kullanmak için uygulamanızın başlatılması gerekiyor
eşzamansız olarak ConsumerApi
. API tek bir API'dir.
Başlatma yöntemi AuthTokenFactory
sürer. Fabrikada, yeni mühendisliğin
Gerektiğinde kullanıcı için JWT jetonları.
providerId
, Google Cloud projenizin proje kimliğidir. Bkz.
Fleet Engine Kullanım Kılavuzu
göz atmayı unutmayın.
Uygulamanız, AuthTokenFactory
öğesini şurada açıklandığı şekilde kullanmalıdır:
Tüketici SDK'sı Kimlik Doğrulaması.
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. Tablo
Aşağıda, Haritalar SDK'sı sürümüne göre varsayılan oluşturucu ve desteklenebilirlik düzeyi özetlenmiştir.
her iki oluşturucuyu da gösterir. Yine de ihtiyacınız varsa en son oluşturucuyu kullanmanızı öneririz.
eski oluşturucuyu kullanmak istiyorsanız bunu,
MapsInitializer.initialize()
.
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 Varsayılan olarak Son oluşturucu kullanılı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 şu numarayı arayın:
MapsInitializer.initialize()
ve başlatmadan önce oluşturucu istek sonucunu bekleyin
Tüketici SDK'sı.
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
ConsumerMapFragment
veya
için kullanıcı arayüzünü oluşturmak üzere ConsumerMapView
bir uygulamadır. ConsumerMapFragment
, şunları tanımlamanıza olanak tanır:
haritanızı
Fragment
, ConsumerMapView
ise şunu kullanmanıza olanak tanır:
View
. Araç paylaşma
işlevsellik hem ConsumerMapView
hem de
ConsumerMapFragment
: Böylece, ihtiyaçlarınıza göre bir seçim yapabilirsiniz.
View
veya
Fragment
, uygulamanız için daha iyidir.
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ın kullanım kapsamı
AppCompatActivity
Tüketici SDK'sındaki vektör çekilebilir öğeleri.
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ı bir Android parçasında göstermek için harita oluşturursunuz
veya bir görünüm oluşturabilirsiniz. Bu görünüm, uygulama düzeni XML dosyanızda (
/res/layout
) bilgileri gösterilir. Ardından parça (veya görünüm), yolculuğa erişim sağlar
uygulamanızın erişip değiştirebileceği bir harita paylaşımında bulunun. Harita ayrıca
ConsumerController
için tutma yeri, uygulamanızın
kontrol ve kontrol etmesini sağlar.
yolculuk paylaşımı deneyimini özelleştirebilirsiniz.
Yolculuk paylaşımı haritası ve denetleyici
Yolculuk paylaşımı haritasını bir parça (
ConsumerMapFragment
) veya görünüm olarak (ConsumerMapView
kullanılarak)
aşağıdaki kod örneğini inceleyebilirsiniz. Sonrasında, onCreate()
yönteminiz şunu çağırır:
ConsumerGoogleMap
değerini döndüren getConsumerGoogleMapAsync(callback)
eşzamansız olarak çağırmanızı sağlar. Daha sonra, aşağıdakileri görüntülemek için ConsumerGoogleMap
ve gerektiğinde uygulamanız tarafından güncellenebilir.
ConsumerMapFragment
Parçayı aşağıdaki gibi uygulama düzeni XML dosyanızda tanımlarsınız: aşağıdaki kod örneğine bakalım.
<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()
numaralı telefona yapılacak arama onCreate()
kaynağından gelecek
yöntemidir.
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 dosyası olarak kaydedin.
<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. İçinde
geri çağırma parametresine ek olarak,
parçası ve yapılandırmayı içeren GoogleMapOptions
(boş olabilir)
özellikleri MapView
için geçerlidir. Etkinlik veya parça temel sınıfı
sağladığı için (sırasıyla) bir FragmentActivity
veya destek Fragment
(sırasıyla)
yaşam döngüsüne erişmelerini sağlar.
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
, içindeki MapView
için yukarıdaki örnekte olduğuyla aynıdır.
Ancak parçanın, şunu içeren düzeni şişirmesi dışında:
MapView
, parça onCreateView()
yönteminde kullanılıyor.
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ı ortalamak isteyebilirsiniz. cihaz konumu yerine yolculuğa odaklanmaya çalışın.
Yerleşik Android çözümü için Tüketici SDK'sı: AutoKamera
Cihaz konumu yerine yolculuğa odaklanmanızı sağlamak için Tüketici SDK'sı, otomatik kamera özelliği sayesinde varsayılan olarak etkindir. Kamera, yolculuk paylaşımı rotasına odaklanmak için görüntüyü yakınlaştırır ve seyahat edeceğim bir sonraki ara noktayı gösterin.
Kamera davranışını özelleştirme
Kamera davranışı üzerinde daha fazla kontrole ihtiyacınız varsa bu özelliği devre dışı bırakabilir veya etkinleştirebilirsiniz ConsumerController.setAutoCameraEnabled() aracılığıyla otomatik kamera.
ConsumerController.getCameraUpdate(), önerilen kamera sınırlarını döndürür. Ardından bu CameraUpdate
öğesini bağımsız değişken olarak sağlayabilirsiniz.
GoogleMap.moveCamera() veya GoogleMap.animateCamera().
Araç paylaşımına ve haritalara erişme
Uygulamanızda araç paylaşımı ve harita etkileşimini desteklemek için
ConsumerGoogleMap
ve
ConsumerController
.
ConsumerMapFragment
ve
ConsumerMapView
her ikisi de eşzamansız olarak döndürülür
ConsumerMapReadyCallback
içinde ConsumerGoogleMap
.
ConsumerGoogleMap
karşılığında iade
getConsumerController()
satıcısından ConsumerController
. Siz
ConsumerGoogleMap
ve
ConsumerController
gibi.
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
, şunun için bir sarmalayıcı sınıfıdır:
GoogleMap
sınıf. Uygulamanız için; örneğin,
eşlemeye eşdeğer bir API kullanarak haritayla etkileşime geçme
GoogleMap
Tüketici haritasını kullanmak, uygulamanızı ve yolculuk
temelde yer alan aynı Google Haritası ile sorunsuz bir şekilde etkileşimde
bulunabilmenizi 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ın
çağrılır.
ConsumerController
ConsumerController
, şu gibi yolculuk paylaşımı işlevleri için erişim sağlar:
seyahatleri izleme, gezi durumunu kontrol etme ve yer belirleme gibi.
Yolculuk paylaşımını ayarlayın
Arka uç, bir tüketiciyi araçla eşleştirdikten sonra JourneySharingSession
işlevini kullanın.
yolculuk paylaşımı kullanıcı arayüzünü başlatın. Yolculuk paylaşımında, eşleşen bilgiler gösterilir
Aracın konumu ve rotası. SDK'yı uygulamanıza ekledikten sonra
gezileri izleme, güncellemeleri dinleme ve hataları ele alma işlevleri.
Aşağıdaki prosedürlerde arka uç hizmetlerinin yürürlükte olduğu ve
Müşterileri araçlarla eşleştirmeye yönelik hizmetler çalışır durumda.
Şununla ilgili ayrıntıları almak için bir
TripModel
nesnesinde işleyici kaydedin tahmini varış saati ve mesafe gibi bilgiler de içerir. varıştan önce seyahat etmesi gerekir.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ı eşleme
hataları için belirlenen HTTP/RPC yönergelerine uyun,
Google Cloud Platform'a gidin.
Gezi izleme sırasında sıklıkla karşılaşılan hatalar şunlardır:
HTTP | TBG | Açıklama |
---|---|---|
400 | GEÇERSİZ_BAĞ_DEĞİŞKEN | Müşteri, geçersiz bir gezi adı belirtti. İlgili içeriği oluşturmak için kullanılan
gezi adı biçime uygun olmalıdır
providers/{provider_id}/trips/{trip_id}
provider_id,
Servis sağlayıcıya ait Cloud projesi. |
401 | KİMLİK DOĞRULAMADI | Aşağıdaki nedenden dolayı isteğin kimliği doğrulanmadı: Geçersiz JWT jetonu. Bu hata oluşur JWT jetonu seyahat olmadan imzalanmışsa id veya JWT jetonunun süresi dolmuş. |
403 | PERMISSION_DENIED | İstemci, izni gerekir. Bu hata, JWT jetonu geçersiz, istemcide mevcut anahtar ya da API, karar vermenize yardımcı olacaktır. JWT jetonu şöyle olabilir: eksik veya jeton bir gezi ile imzalanmış istenen gezi kimliğiyle eşleşmeyen kimlik. |
429 | RESOURCE_EXHAUSTED | Kaynak kotası sıfır veya hızdadır sınırı aşıyor. |
503 | UNAVAILABLE | Hizmet kullanılamıyor. Genellikle sunucu düştü. |
504 | DEADLINE_EXCEEDED | İstek son tarihi aşıldı. Bu, yalnızca arayan kişi bir son tarih belirlerse gerçekleşir yöntemin varsayılan değerinden daha kısadır (ör. istenen son tarihin sunucu tarafından işleme alınması için isteği yerine getirilmedi) takip etmeniz gerekir. |
Daha fazla bilgi için bkz. Tüketici SDK'sı Hatalarını Giderme.