Minimum sistem gereksinimleri
Mobil cihazın Android 6.0 (API düzeyi 23) veya sonraki bir sürümü çalıştırıyor olması gerekir.
Derleme ve bağımlılık yapılandırması
Sürücü SDK'sı 4.99 ve sonraki sürümleri, Google Maven deposunda mevcuttur.
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ı
Sürücü SDK'sını kullanmak için uygulamanızın minSdkVersion
23 veya sonraki bir sürümü hedeflemesi gerekir. Daha fazla bilgi için Sürüm Notları'na göz atın.
Sürücü 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 ayarlamak ve Google Cloud Console'da proje için bir API anahtarı almak için:
Sürücü SDK'sı ile kullanmak için yeni bir Google Cloud Console projesi oluşturun veya mevcut bir projeyi seçin. Yeni proje Google Cloud Console'da görünür olana kadar birkaç dakika bekleyin.
Demo uygulamayı çalıştırmak için 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, ardından Android için Haritalar SDK'sını bulup etkinleştirin.
API'ler ve Hizmetler > Kimlik Bilgileri > Kimlik bilgileri 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.
Sürücü SDK'sını uygulamanıza ekleyin
Sürücü SDK'sına Google Maven deposundan ulaşabilirsiniz. Bu depo, SDK'nın Proje Nesne Modeli (.pom) dosyalarını ve Java belgelerini içerir. Sürücü SDK'sını uygulamanıza eklemek için:
Sürücü SDK'sının seçili sürümü için
VERSION_NUMBER
yer tutucusunu değiştirerek aşağıdaki bağımlılığı Gradle veya Maven yapılandırmanıza ekleyin.Gradle
build.gradle
cihazınıza aşağıdakileri ekleyin:dependencies { ... implementation 'com.google.android.libraries.mapsplatform.transportation:transportation-driver:[VERSION_NUMBER]' }
Maven
pom.xml
cihazınıza aşağıdakileri ekleyin:<dependencies> ... <dependency> <groupId>com.google.android.libraries.mapsplatform.transportation.driver</groupId> <artifactId>transportation-driver</artifactId> <version>[VERSION_NUMBER]</version> </dependency> </dependencies>
Sürücü SDK'sı, Navigation SDK'ya bağlıdır. Bu bağımlılık, Navigation SDK'nın belirli bir sürümü gerektiğinde derleme yapılandırma dosyasında aşağıdaki gibi açıkça tanımlanması gerekir. Belirtilen kod bloğunun atlanması, projenin daima ana sürüm içindeki Navigasyon SDK'sının son sürümünü indirmesini sağlar. Driver SDK'sı ve Navigasyon SDK'sının son sürümlerinin birleşik davranışları, kullanıma sunulmadan önce sıkı testlerden geçmiştir.
Geliştirme ve sürüm ortamlarınızın bağımlılık yapılandırmasını uygun şekilde düzenleyin.
Gradle
build.gradle
cihazınıza aşağıdakileri ekleyin:dependencies { ... implementation 'com.google.android.libraries.navigation:navigation:5.0.0' }
Maven
pom.xml
cihazınıza aşağıdakileri ekleyin:<dependencies> ... <dependency> <groupId>com.google.android.libraries.navigation</groupId> <artifactId>navigation</artifactId> <version>5.0.0</version> </dependency> </dependencies>
API anahtarını uygulamanıza ekleme
Sürücü 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ın daha güvenli bir şekilde referans gösterebilmesi için API anahtarınızı nasıl depolayacağınız açıklanmaktadır. API anahtarınızı sürüm kontrol sisteminize girmemelisiniz. Bu dosya, projenizin kök dizininde bulunan local.properties
dosyasında depolanmalıdır. local.properties
dosyası hakkında daha fazla bilgi için Gradle özelliği dosyaları bölümüne bakın.
Bu görevi kolaylaştırmak için Android için Secrets Gradle Plugin'i kullanın. Secrets Gradle eklentisini yüklemek ve API anahtarınızı güvenli bir şekilde saklamak için bu prosedürü uygulayın.
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 ve aşağıdaki koduplugins
öğesine ekleyin.Modern
id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
Kotlin
id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin")
Proje düzeyi dizininizde
local.properties
dosyasını açın ve aşağıdaki kodu ekleyin.YOUR_API_KEY
kısmını API anahtarınızla değiştirmeyi unutmayın.MAPS_API_KEY=YOUR_API_KEY
AndroidManifest.xml
dosyanızdacom.google.android.geo.API_KEY
adresine gidipandroid:value
özelliğini aşağıdaki gibi 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 manifestin tamamı gösterilmektedir:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.driverapidemo" >
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_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>
Gerekli ilişkilendirmeleri uygulamanıza dahil edin
Uygulamanızda Sürücü SDK'sını kullanıyorsanız uygulamanızın yasal uyarılar bölümüne atıf metni ve açık kaynak lisansları eklemeniz gerekir. İlişkilendirmeleri bağımsız bir menü öğesi olarak veya Hakkında menü öğesinin parçası olarak eklemeniz önerilir.
Lisans bilgileri, arşivlenmemiş 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 sayfasına bakın.
Bağımlılıklar
Sürücü SDK'sı, Fleet Engine sunucusuyla iletişim kurmak için gRPC'yi kullanır. gRPC'yi henüz getirmiyorsanız aşağıdaki bağımlılıkları bildirmeniz gerekebilir:
dependencies {
implementation 'io.grpc:grpc-android:1.12.0'
implementation 'io.grpc:grpc-okhttp:1.12.0'
}
Bu bağımlılıklar olmadan, Sürücü SDK'sı çalışma zamanında Fleet Engine sunucusuyla iletişim kurmaya çalışırken hatalarla karşılaşabilir.
Derlemelerinizi optimize etmek için ProGuard'ı kullanıyorsanız ProGuard yapılandırma dosyanıza aşağıdaki satırları eklemeniz gerekebilir:
-dontwarn com.google.**
-dontwarn io.grpc.**
-dontwarn okio.**
Desteklenen minimum API düzeyi 23'tür.
SDK'yı başlatma
DriverContext
nesnesini başlatmak için sağlayıcı kimliği (genellikle Google Cloud Proje Kimliği) gerekir. Google Cloud projesini ayarlama hakkında daha fazla bilgi için Kimlik Doğrulama ve Yetkilendirme sayfasını inceleyin.
Sürücü SDK'sını kullanmadan önce, Navigasyon SDK'sını başlatmanız gerekir. SDK'yı başlatmak için:
NavigationApi
öğesinden birNavigator
nesnesi edinin.NavigationApi.getNavigator( this, // Activity new NavigationApi.NavigatorListener() { @Override public void onNavigatorReady(Navigator navigator) { // Keep a reference to the Navigator (used to configure and start nav) this.navigator = navigator; } } );
Zorunlu alanları doldurarak bir
DriverContext
nesnesi oluşturun.DriverContext driverContext = DriverContext.builder(application) .setProviderId(providerId) .setVehicleId(vehicleId) .setAuthTokenFactory(authTokenFactory) .setNavigator(navigator) .setRoadSnappedLocationProvider( NavigationApi.getRoadSnappedLocationProvider(application)) .build();
*DriverApi
öğesini başlatmak içinDriverContext
nesnesini kullanın.DeliveryDriverApi driverApi = DeliveryDriverApi.createInstance(driverContext);
API nesnesinden
DeliveryVehicleReporter
edinin. (DeliveryVehicleReporter
değeriNavigationVehicleReporter
tarihinde uzatıldı.)DeliveryVehicleReporter vehicleReporter = driverApi.getDeliveryVehicleReporter();
AuthTokenFactory
üzerinde kimlik doğrulanıyor
Sürücü SDK'sı, konum güncellemeleri oluşturduğunda bu güncellemeleri Fleet Engine sunucusuna göndermelidir. Driver SDK'sı, bu isteklerin kimliğini doğrulamak için arayan tarafından sağlanan AuthTokenFactory
örneğini çağırır.
Konum güncelleme zamanında kimlik doğrulama jetonları oluşturmaktan fabrika sorumludur.
Jetonların tam olarak nasıl oluşturulduğu her geliştiricinin durumuna göre değişir. Ancak, uygulamada muhtemelen:
- HTTPS sunucusundan büyük olasılıkla JSON biçiminde bir kimlik doğrulama jetonu getir
- jetonu ayrıştırıp önbelleğe alın
- süresi dolduğunda jetonu yenileyin
Fleet Engine sunucusunun beklediği jetonların ayrıntıları için Yetkilendirme için JSON Web Jetonu (JWT) oluşturma bölümüne bakın.
Burada, bir AuthTokenFactory
uygulamasının iskelet uygulaması gösterilmektedir:
class JsonAuthTokenFactory implements AuthTokenFactory {
private String vehicleServiceToken; // initially null
private long expiryTimeMs = 0;
// This method is called on a thread whose only responsibility is to send
// location updates. Blocking is OK, but just know that no location updates
// can occur until this method returns.
@Override
public String getToken(AuthTokenContext authTokenContext) {
if (System.currentTimeMillis() > expiryTimeMs) {
// The token has expired, go get a new one.
fetchNewToken(vehicleId);
}
if (ServiceType.VEHICLE.equals(authTokenContext.getServiceType)) {
return vehicleServiceToken;
} else {
throw new RuntimeException("Unsupported ServiceType: " + authTokenContext.getServiceType());
}
}
private void fetchNewToken(String vehicleId) {
String url = "https://yourauthserver.example/token/" + vehicleId;
try (Reader r = new InputStreamReader(new URL(url).openStream())) {
com.google.gson.JsonObject obj
= com.google.gson.JsonParser.parseReader(r).getAsJsonObject();
vehicleServiceToken = obj.get("VehicleServiceToken").getAsString();
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 10 minutes from that time.
expiryTimeMs -= 10 * 60 * 1000;
} catch (IOException e) {
// It's OK to throw exceptions here. The StatusListener you passed to
// create the DriverContext class will be notified and passed along the failed
// update warning.
throw new RuntimeException("Could not get auth token", e);
}
}
}
Bu özel uygulama, geliştiricinin kimlik doğrulama sunucusundan JSON biçiminde bir jeton almak için yerleşik Java HTTP istemcisini kullanır. Jeton yeniden kullanılmak üzere kaydedilir. Eski jeton, geçerlilik süresinin sona ermesinden sonraki 10 dakika içindeyse jeton yeniden getirilir.
Uygulamanız, jetonları yenilemek için arka plan iş parçacığı kullanma gibi bazı işlemleri farklı yapabilir.
AuthTokenFactory
özelliğindeki istisnalar, tekrarlanmadığı sürece geçici olarak kabul edilir. Birkaç denemeden sonra Sürücü SDK'sı, hatanın kalıcı olduğunu varsayar ve güncelleme göndermeyi bırakır.
StatusListener
ile Durum ve Hata Bildirimi
Sürücü SDK'sı arka planda işlem yaptığından hata, uyarı veya hata ayıklama mesajları gibi belirli etkinlikler gerçekleştiğinde bildirim tetiklemek için StatusListener
düğmesini kullanın. Hatalar doğası gereği geçici olabilir (BACKEND_CONNECTIVITY_ERROR
gibi) veya konum güncellemelerinin kalıcı olarak durdurulmasına neden olabilir (ör. VEHICLE_NOT_FOUND
nedeniyle, yapılandırma hatası verilir).
Aşağıdaki gibi isteğe bağlı bir StatusListener
uygulaması sağlarsınız:
class MyStatusListener implements StatusListener {
/** Called when background status is updated, during actions such as location reporting. */
@Override
public void updateStatus(
StatusLevel statusLevel, StatusCode statusCode, String statusMsg) {
// Status handling stuff goes here.
// StatusLevel may be DEBUG, INFO, WARNING, or ERROR.
// StatusCode may be DEFAULT, UNKNOWN_ERROR, VEHICLE_NOT_FOUND,
// BACKEND_CONNECTIVITY_ERROR, or PERMISSION_DENIED.
}
}
SSL/TLS ile ilgili notlar
Sürücü SDK'sı uygulaması, Fleet Engine sunucusuyla güvenli bir şekilde iletişim kurmak için dahili olarak SSL/TLS kullanır. Android'in önceki sürümleri (API sürümleri 23 veya önceki sürümleri) sunucuyla iletişim kurmak için SecurityProvider
yaması gerektirebilir. Android'de SSL ile çalışma hakkında daha fazla bilgi edinmek için Güvenlik GMS Sağlayıcısı sayfasına göz atın.
Makalede, güvenlik sağlayıcıya yama uygulamak için kullanılan kod örnekleri de yer almaktadır.
Konum güncellemelerini etkinleştir
*VehicleReporter
örneğiniz olduğunda konum güncellemelerini etkinleştirmek oldukça kolaydır:
DeliveryVehicleReporter reporter = ...;
reporter.enableLocationTracking();
Konum güncellemeleri, mümkünse düzenli aralıklarla gönderilir. Her konum güncellemesi, aracın online olduğunu da gösterir.
Varsayılan olarak, raporlama aralığı 10 saniyedir. Raporlama aralığını reporter.setLocationReportingInterval(long, TimeUnit)
ile değiştirebilirsiniz. Desteklenen minimum güncelleme aralığı 5 saniyedir. Güncellemelerin daha sık yapılması isteklerin daha yavaş olmasına ve hatalara neden olabilir.
Konum güncellemelerini devre dışı bırak
Sürücü vardiyası tamamlandığında DeliveryVehicleReporter.disableLocationTracking
numaralı telefonu arayarak konum güncellemelerini durdurabilirsiniz.
Güvenilir model kullanım alanları
Bu bölümde, güvenilir model kullanılırken yaygın kullanım alanları için Sürücü SDK'sının nasıl kullanılacağı açıklanmaktadır.
Araç oluşturma
Sürücü SDK'sından araç oluşturabilirsiniz.
Araç oluşturmadan önce Delivery Driver API'yi başlattığınızdan emin olun. Araç kimliği, Sürücü SDK'sının ilk kullanıma hazırlanması sırasında kullanılan araç ve sağlayıcı kimliğiyle oluşturulmalıdır. Sonra aracı aşağıdaki örnekte gösterildiği gibi oluşturun:
DeliveryDriverApi api = DeliveryDriverApi.getInstance();
DeliveryVehicleManager vehicleManager = api.getDeliveryVehicleManager();
try {
DeliveryVehicle vehicle = vehicleManager.createVehicle().get();
// Handle CreateVehicleRequest DeliveryVehicle response.
} catch (Exception e) {
// Handle CreateVehicleRequest error.
}
Gönderim teslim alma görevi oluşturma
Sürücü SDK'sından bir gönderim teslim alma görevi oluşturabilirsiniz.
Bir görev oluşturmadan önce Delivery Driver API'yi başlattığınızdan emin olun. Görev, Sürücü SDK'sının başlatılması sırasında belirtilen sağlayıcı kimliği kullanılarak oluşturulmalıdır. Ardından aşağıdaki örnekte gösterildiği gibi gönderim teslim alma görevini oluşturun. Görev kimlikleri hakkında bilgi için Görev kimliği örnekleri başlıklı makaleyi inceleyin.
static final String TASK_ID = "task-8241890"; // Avoid auto-incrementing IDs.
DeliveryDriverApi api = DeliveryDriverApi.getInstance();
DeliveryTaskManager taskManager = api.getDeliveryTaskManager();
CreateDeliveryTaskRequest request = CreateDeliveryTaskRequest.builder(TASK_ID)
.setPlannedWaypoint(Waypoint.builder().setLatLng(-6.195139, 106.820826).build())
.setTaskDurationSeconds(2 * 60)
.setParentId("my-tracking-id")
.setTaskType(TaskType.DELIVERY_PICKUP)
.build();
try {
DeliveryTask task = taskManager.createTask(request).get();
// Handle CreateTaskRequest DeliveryTask response.
} catch (Exception e) {
// Handle CreateTaskRequest error.
}
Gönderim teslimat görevi oluşturma
Sürücü SDK'sından bir gönderim teslim görevi oluşturabilirsiniz.
Bir görev oluşturmadan önce Delivery Driver API'yi başlattığınızdan emin olun. Ardından aşağıdaki örnekte gösterildiği gibi gönderim teslimat görevini oluşturun. Görev kimlikleri hakkında bilgi için Görev kimliği örnekleri bölümüne bakın.
static final String TASK_ID = "task-8241890"; // Avoid auto-incrementing IDs.
DeliveryDriverApi api = DeliveryDriverApi.getInstance();
DeliveryTaskManager taskManager = api.getDeliveryTaskManager();
CreateDeliveryTaskRequest request = CreateDeliveryTaskRequest.builder(TASK_ID)
.setPlannedWaypoint(Waypoint.builder().setLatLng(-6.195139, 106.820826).build())
.setTaskDurationSeconds(2 * 60)
.setParentId("my-tracking-id")
.setTaskType(TaskType.DELIVERY_DELIVERY)
.build();
try {
DeliveryTask task = taskManager.createTask(request).get();
// Handle CreateTaskRequest DeliveryTask response.
} catch (Exception e) {
// Handle CreateTaskRequest error.
}
Planlanan kullanım dışı kalma
Sürücü SDK'sından, kullanılabilir olmadığını belirten bir görev (örneğin, sürücü molaları veya araçta yakıt doldurma) oluşturabilirsiniz. Planlanmış kullanılabilirlik durumunu kaldırma görevinde izleme kimliği bulunmamalıdır. İsteğe bağlı olarak bir yer de girebilirsiniz.
Bir görev oluşturmadan önce Delivery Driver API'yi başlattığınızdan emin olun. Ardından, aşağıdaki örnekte gösterildiği gibi kullanılamaz durumda olma görevini oluşturun. Görev kimlikleri hakkında bilgi için Görev kimliği örnekleri bölümüne bakın.
static final String TASK_ID = "task-8241890"; // Avoid auto-incrementing IDs.
DeliveryDriverApi api = DeliveryDriverApi.getInstance();
DeliveryTaskManager taskManager = api.getDeliveryTaskManager();
CreateDeliveryTaskRequest request = CreateDeliveryTaskRequest.builder(TASK_ID)
.setTaskDurationSeconds(2 * 60) // Duration or location (or both) must be provided for a BREAK task.
.setTaskType(TaskType.UNAVAILABLE)
.build();
try {
DeliveryTask task = taskManager.createTask(request).get();
// Handle CreateTaskRequest DeliveryTask response.
} catch (Exception e) {
// Handle CreateTaskRequest error.
}
Planlanan aktarmalar
Sürücü SDK'sından zamanlanmış bir durdurma görevi oluşturabilirsiniz. Planlanmış bir durdurma görevi izleme kimliği içermeyebilir.
Bir görev oluşturmadan önce Delivery Driver API'yi başlattığınızdan emin olun. Ardından, aşağıdaki örnekte gösterildiği gibi zamanlanan durdurma görevini oluşturun. Görev kimlikleri hakkında bilgi için Görev kimliği örnekleri bölümüne bakın.
static final String TASK_ID = "task-8241890"; // Avoid auto-incrementing IDs.
DeliveryDriverApi api = DeliveryDriverApi.getInstance();
DeliveryTaskManager taskManager = api.getDeliveryTaskManager();
CreateDeliveryTaskRequest request = CreateDeliveryTaskRequest.builder(TASK_ID)
.setPlannedWaypoint(Waypoint.builder().setLatLng(-6.195139, 106.820826).build())
.setTaskDurationSeconds(2 * 60)
.setTaskType(TaskType.DELIVERY_SCHEDULED_STOP)
.build();
try {
DeliveryTask task = taskManager.createTask(request).get();
// Handle CreateTaskRequest DeliveryTask response.
} catch (Exception e) {
// Handle CreateTaskRequest error.
}
Görev sıralamasını güncelleme
Sürücü SDK'sından bir araca atanan görevlerin yürütülme sırasını güncelleyebilirsiniz.
Görev sıralamasını güncellemek, daha önce bir araca atanmamış olan görevleri de bir araca atar. Ayrıca daha önce bir araca atanmış ve güncellenmiş sıralamanın dışında bırakılmış olan görevler de kapatılır. Bir görev daha önce başka bir araca atanmışsa farklı bir araca atandığında hata oluşur. Yeni araca görev atamadan önce mevcut görevi kapatın ve yeni bir görev oluşturun.
Görev sıralamasını istediğiniz zaman güncelleyebilirsiniz.
Bir araç için görev sıralamasını güncellemeden önce aracın ve görevlerin Fleet Engine'de oluşturulduğundan emin olun. Ardından aşağıdaki örnekte gösterildiği gibi aracın görev sıralamasını güncelleyin.
DeliveryDriverApi api = DeliveryDriverApi.getInstance();
DeliveryVehicleReporter reporter = api.getDeliveryVehicleReporter();
try {
List<VehicleStop> stops = reporter.setVehicleStops(
ImmutableList.of(
VehicleStop.builder()
.setVehicleStopState(VehicleStopState.ARRIVED)
.setWaypoint(Waypoint.builder().setLatLng(37.1749, 122.412).build())
.setTasks(ImmutableList.of(task1)) // Previously created DeliveryTask in Fleet Engine.
.build(),
VehicleStop.builder()
.setVehicleStopState(VehicleStopState.NEW) // The current vehicle stop.
.setWaypoint(Waypoint.builder().setLatLng(37.7749, 122.4194).build())
.setTasks(ImmutableList.of(task2)) // Previously created DeliveryTask in Fleet Engine.
.build(),
VehicleStop.builder()
.setVehicleStopState(VehicleStopState.NEW)
.setWaypoint(Waypoint.builder().setLatLng(37.3382, 121.8863).build())
.setTasks(ImmutableList.of(task3, task4)) // Previously created DeliveryTasks in Fleet Engine.
.build())).get();
// Successfully updated vehicle stops in Fleet Engine. Returns the successfully set VehicleStops.
} catch (Exception e) {
// Failed to update vehicle stops in Fleet Engine. Setting VehicleStops must be attempted again after resolving
// errors.
}
Sürücü SDK'sının dahili durumunda güncelleme yapılmasını engelleyebilecek bir istisna oluşabilir. Böyle bir durumda sorunu çözün ve arama başarılı olana kadar
setVehicleStops
adlı kişiyi tekrar arayın.
Potansiyel sorunlar şunları içerebilir:
Belirtilen VehicleStop'lar geçerli bir kalıbı izlemiyor. Yalnızca ilk VehicleStop durumu, herhangi bir VehicleStopState'te olabilir: NEW, ENROUTE veya ARRIVED. Geçerli duraktan sonraki VehicleStops, YENİ VehicleStopState'te olmalıdır.
Görevler mevcut değil veya farklı bir araca ait.
Araç mevcut değil.
Araç bir sonraki durağa gidiyor
Bir araç bir duraktan hareket ettiğinde ve araç navigasyona başladığında Fleet Engine'e bildirilmelidir. Fleet Engine'e Sürücü SDK'sından bildirim gönderebilirsiniz.
Fleet Engine'e bir aracın duraktan ayrıldığını bildirmeden önce araç duraklarının oluşturulduğundan ve ayarlandığından emin olun. Ardından aşağıdaki örnekte gösterildiği gibi, Fleet Engine'e aracın kalktığını bildirin.
DeliveryDriverApi api = DeliveryDriverApi.getInstance();
DeliveryVehicleReporter reporter = api.getDeliveryVehicleReporter();
reporter.enableLocationTracking(); // Location tracking must be enabled.
// Create Vehicle, VehicleStops, and DeliveryTasks.
// Set VehicleStops on Vehicle.
navigator.setDestination(vehicleStop.getWaypoint());
try {
List<VehicleStop> updatedStops = reporter.enrouteToNextStop().get();
// Successfully updated vehicle stops in Fleet Engine. Returns the set VehicleStops, with the first
// VehicleStop updated to ENROUTE state.
} catch (Exception e) {
// Failed to update vehicle stops in Fleet Engine. Updating VehicleStops must be attempted again
// after resolving errors.
}
Sürücü SDK'sının dahili durumunun güncellenmesini engelleyebilecek bir istisna oluşabilir. Bu durumda sorunu çözün ve işlem başarılı olana kadar enrouteToNextStop
adlı iş ortağını tekrar arayın.
Potansiyel sorunlar şunları içerebilir:
- Sürücü SDK'sında ayarlanmış kalan
VehicleStops
kalmadı.
Araç durağa iniyor
Araç durağa geldiğinde Fleet Engine'e bildirilmelidir. Fleet Engine'i Sürücü SDK'sından bilgilendirebilirsiniz.
Fleet Engine'e bir aracın durağa geldiğini bildirmeden önce araç duraklarının ayarlandığından emin olun. Ardından aşağıdaki örnekte gösterildiği gibi, aracın durağa geldiğini Fleet Engine'e bildirin.
DeliveryDriverApi api = DeliveryDriverApi.getInstance();
DeliveryVehicleReporter reporter = api.getDeliveryVehicleReporter();
reporter.enableLocationTracking(); // Location tracking must be enabled.
// Create Vehicle, VehicleStops, and DeliveryTasks.
// Set VehicleStops on Vehicle.
// Mark ENROUTE to VehicleStop and start guidance using Navigator.
try {
List<VehicleStop> updatedStopsArrived = reporter.arrivedAtStop().get();
// Successfully updated vehicle stops in Fleet Engine. Returns the set VehicleStops, with the first
// VehicleStop updated to ARRIVED state.
navigator.clearDestinations();
} catch (Exception e) {
// Failed to update vehicle stops in Fleet Engine. Updating VehicleStops must be attempted again
// after resolving errors.
}
Sürücü SDK'sının dahili durumunun güncellenmesini engelleyebilecek bir istisna oluşabilir. Bu durumda, sorunu çözün ve işlem başarılı olana kadar arrivedAtStop
adlı iş ortağını tekrar arayın.
Olası sorunlar şunları içerebilir:
- Sürücü SDK'sında ayarlanmış kalan
VehicleStops
kalmadı.
Araç bir durağı tamamlar
Bir araç durmayı tamamladığında Fleet Engine'e bildirimde bulunmanız gerekir. Bu bildirim, durakla ilişkili tüm görevlerin KAPALI durumuna ayarlanmasına neden olur. Fleet Engine'i Sürücü SDK'sından bilgilendirebilirsiniz.
Fleet Engine'e, aracın VehicleStop'ın tamamlandığını aşağıdaki örnekte gösterildiği gibi bildirin.
DeliveryDriverApi api = DeliveryDriverApi.getInstance();
DeliveryVehicleReporter reporter = api.getDeliveryVehicleReporter();
reporter.enableLocationTracking(); // Location tracking must be enabled.
// After completing the tasks at the VehicleStop, remove it from the
// the current list of VehicleStops.
try {
List<VehicleStop> updatedStopsCompleted = reporter.completedStop().get();
// Successfully updated vehicle stops in Fleet Engine. All tasks on the completed stop are set to CLOSED.
// Returns the set VehicleStops, with the completed VehicleStop removed from the remaining list.
} catch (Exception e) {
// Failed to update vehicle stops in Fleet Engine. Updating VehicleStops must be attempted again
// after resolving errors.
}
Sürücü SDK'sının dahili durumunun güncellenmesini engelleyebilecek bir istisna oluşabilir. Bu durumda, sorunu çözün ve işlem başarılı olana kadar completedStop
adlı iş ortağını tekrar arayın.
Potansiyel sorunlar şunları içerebilir:
- Sürücü SDK'sında ayarlanmış kalan
VehicleStops
kalmadı.
Görevi kapatma
Bir araca atanmış bir görevi kapatmak için Fleet Engine'e aracın görevin gerçekleştirildiği durağın tamamlandığını bildirin veya aracı duraklar listesinden kaldırın. Bunu yapmak için kalan araç duraklarının listesini, bir araç için görev sırasını güncellerken olduğu gibi ayarlayabilirsiniz.
Bir görev henüz bir araça atanmamışsa ve aracın kapatılması gerekiyorsa görevi KAPALI durumuna güncelleyin. Ancak KAPATILDI bir görevi yeniden açamazsınız.
Bir görevin kapatılması, görevin başarılı veya başarısız olduğunu göstermez. Bu da görevin artık devam ediyor olarak değerlendirilmediğini gösterir. Gönderim takibinde, teslimat sonucunun gösterilebilmesi için görevin gerçek sonucunu belirtmek önemlidir.
Bir araca, Sürücü SDK'sının bir görevi tamamlarken kullanabilmesi için bir görev atanmalıdır. Bir araca atanmış bir görevi kapatmak için Filo Motoru'na aracın görevin gerçekleştirildiği durağın tamamlandığını bildirin.
Alternatif olarak, görevin atandığı aracın görev sıralamasını güncelleyin ve ardından görevi durak listesinden kaldırın.
Görevin sonucunu ve sonucun konumunu belirleme
Bir görevin kapatılması, görevin başarılı veya başarısız olduğunu göstermez. Bu da görevin artık devam ediyor olarak değerlendirilmediğini gösterir. Gönderim takibinde, teslimat sonucunun gösterilmesi ve hizmetler için uygun faturalandırmanın yapılabilmesi için bir görevin gerçek sonucunu belirtmek önemlidir. Bir kez ayarlandıktan sonra görev sonucunu değiştiremezsiniz. Ama görev sonuç zamanını ve görev sonuç konumunu belirledikten sonra değiştirebilirsiniz.
KAPALI durumdaki görevlerin sonucu BAŞARILI veya BAŞARISIZ olarak ayarlanabilir. Fleet Engine, yalnızca SUCCEEDED durumundaki teslimat görevleri için ücret alır.
Fleet Engine, bir görevin sonucu işaretlerken görev sonucu konumunu, bilinen son araç konumuyla otomatik olarak doldurur. Bu davranışı geçersiz kılabilirsiniz.
Aşağıdaki örnekte, görev sonucunu ve zaman damgasını ayarlamak için Driver SDK'sının nasıl kullanılacağı gösterilmektedir. Görev sonucunun konumunu Sürücü SDK'sını kullanarak ayarlayamazsınız.
static final String TASK_ID = "task-8241890";
DeliveryDriverApi api = DeliveryDriverApi.getInstance();
DeliveryTaskManager taskManager = api.getDeliveryTaskManager();
// Updating an existing DeliveryTask which is already CLOSED. Manually
// setting TaskOutcomeLocation with Driver SDK is not supported at this time.
UpdateDeliveryTaskRequest req = UpdateDeliveryTaskRequest.builder(TASK_ID)
.setTaskOutcome(TaskOutcome.SUCCEEDED)
.setTaskOutcomeTimestamp(now()) // Timestamp in milliseconds.
.build();
try {
DeliveryTask updatedTask = taskManager.updateTask(req);
// Handle UpdateTaskRequest DeliveryTask response.
} catch (Exception e) {
// Handle UpdateTaskRequest error.
}
Araç arama
Sürücü SDK'sından araç arayabilirsiniz. Bir araç aramadan önce Delivery Driver API'yi başlattığınızdan emin olun. Ardından aracı aşağıdaki örnekte gösterildiği gibi arayabilirsiniz.
DeliveryDriverApi api = DeliveryDriverApi.getInstance();
DeliveryVehicleManager vehicleManager = api.getDeliveryVehicleManager();
try {
DeliveryVehicle vehicle = vehicleManager.getVehicle().get();
// Handle GetVehicleRequest DeliveryVehicle response.
} catch (Exception e) {
// Handle GetVehicleRequest error.
}
DeliveryVehicleManager
, yalnızca Delivery Driver API'nin başlatılması sırasında sağlanan araç kimliğini DeliveryVehicle
bulabilir.