Android için Driver SDK'yı kullanmaya başlama

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:

  1. 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.

  2. 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.

  3. 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:

  1. 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>
    
  2. 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.

  1. Kök düzeyindeki build.gradle dosyanızı açın ve aşağıdaki kodu buildscript altındaki dependencies öğ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")
        }
    }
    
  2. Uygulama düzeyindeki build.gradle dosyanızı açın ve aşağıdaki kodu plugins öğesine ekleyin.

    Modern

    id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
    

    Kotlin

    id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin")
    
  3. Projenizi Gradle ile senkronize edin.

  4. 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
    
  5. AndroidManifest.xml dosyanızda com.google.android.geo.API_KEY adresine gidip android: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:

  1. NavigationApi öğesinden bir Navigator 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;
          }
        }
    );
    
  2. 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();
    
  3. *DriverApi öğesini başlatmak için DriverContext nesnesini kullanın.

    DeliveryDriverApi driverApi = DeliveryDriverApi.createInstance(driverContext);
    
  4. API nesnesinden DeliveryVehicleReporter edinin. (DeliveryVehicleReporter değeri NavigationVehicleReporter 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.