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

Minimum sistem gereksinimleri

Mobil cihazda Android 6.0 (API düzeyi 23) veya sonraki bir sürüm yüklü olmalıdır.

Derleme ve bağımlılık yapılandırması

Sürücü SDK'sı 4.99 ve sonraki sürümleri Google Maven deposundan kullanılabilir.

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ı

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

Driver SDK ile oluşturulan 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:

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

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

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

Sürücü SDK'sını uygulamanıza ekleyin

Sürücü SDK'sı, Google Maven deposundan edinilebilir. Depo, SDK'nın Proje Nesne Modeli (.pom) dosyalarını ve Javadocs'larını içerir. Sürücü SDK'sını uygulamanıza eklemek için:

  1. Aşağıdaki bağımlılığı Gradle veya Maven yapılandırmanıza ekleyerek Drive SDK'nın seçili sürümünde VERSION_NUMBER yer tutucusunu değiştirin.

    Gradle

    build.gradle cihazınıza şunları ekleyin:

    dependencies {
      ...
      implementation 'com.google.android.libraries.mapsplatform.transportation:transportation-driver:VERSION_NUMBER'
    }
    

    Maven

    pom.xml cihazınıza şunları ekleyin:

    <dependencies>
      ...
      <dependency>
        <groupId>com.google.android.libraries.mapsplatform.transportation</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ünün gerekli olması durumunda derleme yapılandırma dosyasında aşağıdaki gibi açıkça tanımlanmasını gerektirecek şekilde yapılandırılır. Belirtilen kod bloğunun atlanması, projenin ana sürüm sürümünde her zaman Navigasyon SDK'sının en son sürümünü indirebilmesini sağlar. Driver SDK ve Navigation SDK'nın son sürümlerinin birleşik davranışlarının, yayınlanmadan önce titiz testlerden geçtiğini unutmayın.

    Geliştirme ve yayınlama ortamlarınızın bağımlılık yapılandırmasını buna göre düzenleyin.

    Gradle

    build.gradle cihazınıza şunları ekleyin:

    dependencies {
      ...
      implementation 'com.google.android.libraries.navigation:navigation:5.0.0'
    }
    

    Maven

    pom.xml cihazınıza şunları ekleyin:

    <dependencies>
      ...
      <dependency>
        <groupId>com.google.android.libraries.navigation</groupId>
        <artifactId>navigation</artifactId>
        <version>5.0.0</version>
      </dependency>
    </dependencies>
    

Uygulamanızın manifest dosyasını güncelleme

Driver SDK'sını uygulamanıza ekledikten sonra AndroidManifest.xml dosyasını düzenleyerek uygulamanızın manifest dosyasını güncelleyebilirsiniz.

<application> öğesinin içine API anahtarınızı ekleyin. Geliştirme projenizi oluştururken edindiğiniz proje API anahtarını kullanmanız gerekir.

Örneğin, aşağıdaki uygulama meta verilerinde PASTE_YOUR_API_KEY_HERE kısmını API anahtarınızla değiştirin:

<meta-data
    android:name="com.google.android.geo.API_KEY"
    android:value="PASTE_YOUR_API_KEY_HERE"/>

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.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="PASTE_YOUR_API_KEY_HERE"/>

        <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 Driver SDK'sını kullanıyorsanız uygulamanızın yasal uyarılar bölümünün bir parçası olarak atıf 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.

Bağımlılıklar

Driver SDK, Fleet Engine sunucusuyla iletişim kurmak için gRPC'yi kullanır. Henüz gRPC eklemediyseniz 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 olmadığında, Driver SDK'sı Fleet Engine sunucusuyla iletişim kurmaya çalışırken çalışma zamanında hatalarla karşılaşır.

Derlemelerinizi optimize etmek için ProGuard kullanıyorsanız aşağıdaki satırları ProGuard yapılandırma dosyanıza eklemeniz gerekebilir:

-dontwarn com.google.**
-dontwarn io.grpc.**
-dontwarn okio.**

Desteklenen minimum API düzeyi 23'tür.

SDK'yı başlatma

FleetEngine nesnesini başlatmak için bir 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 bölümüne bakın.

Driver 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 alın.

    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 öğesini alın. (DeliveryVehicleReporter, NavigationVehicleReporter süresini uzatır.)

    DeliveryVehicleReporter vehicleReporter = driverApi.getDeliveryVehicleReporter();
    

AuthTokenFactory ile kimlik doğrula

Sürücü SDK'sı konum güncellemeleri oluşturduğunda bu güncellemeleri Google Fleet Engine sunucusuna göndermelidir. Sürücü SDK'sı, bu isteklerin kimliğini doğrulamak için çağrı tarafından sağlanan AuthTokenFactory örneğine çağrı yapar. Fabrika, konum güncelleme zamanında kimlik doğrulama jetonları oluşturmaktan sorumludur.

Jetonların tam olarak nasıl oluşturulduğu her geliştiricinin kendi durumuna göre değişir. Ancak, uygulama işlemi için muhtemelen:

  • Bir HTTPS sunucusundan JSON biçiminde bir kimlik doğrulama jetonu alın.
  • Jetonu ayrıştırıp önbelleğe alın.
  • Jetonu süresi dolduğunda yenileyin.

Fleet Engine sunucusu tarafından beklenen jetonlarla ilgili ayrıntılar için Yetkilendirme için JSON Web Jetonu (JWT) oluşturma bölümüne bakın.

Aşağıda bir AuthTokenFactory'nin iskelet uygulaması verilmiştir:

class JsonAuthTokenFactory implements AuthTokenFactory {
  String vehicleServiceToken;  // initially null
  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 URL(url).openStream()) {
      com.google.gson.JsonObject obj
          = new com.google.gson.JsonParser().parse(r);
      vehicleServiceToken = obj.get("VehicleServiceToken").getAsString();
      expiryTimeMs = obj.getAsLong("TokenExpiryMs");

      // 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 FleetEngine class will be notified and pass 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 getirmek için yerleşik Java HTTP istemcisini kullanır. Jeton yeniden kullanılmak üzere kaydedilir. Eski jetonun geçerlilik bitiş tarihinden önceki 10 dakika içindeyse jeton tekrar getirilir.

Uygulamanız, jetonları yenilemek için arka plan ileti dizisi kullanmak gibi işleri farklı şekilde yapabilir.

AuthTokenFactory ürünündeki istisnalar, tekrar tekrar yapılmadığı sürece geçici olarak değerlendirilir. Birkaç denemeden sonra Driver SDK, hatanın kalıcı olduğunu varsayar ve güncelleme göndermeyi durdurur.

StatusListener ile Durum ve Hata Bildirimi

Driver SDK arka planda işlemler gerçekleştirdiğinden; hata, uyarı veya hata ayıklama mesajı gibi belirli olaylar gerçekleştiğinde bildirimleri tetiklemek için StatusListener bileşenini kullanın. Hatalar geçici olabilir (BACKEND_CONNECTIVITY_ERROR gibi) veya konum güncellemelerinin kalıcı olarak durdurulmasına neden olabilir (VEHICLE_NOT_FOUND gibi bir yapılandırma hatasına işaret eder).

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 İlgili Notlar

Sürücü SDK'sı uygulaması, dahili olarak Fleet Engine sunucusuyla güvenli iletişim kurmak için SSL/TLS kullanır. Android'in daha eski sürümleri (API 23 veya önceki sürümler), sunucuyla iletişim kurmak için SecurityProvider yaması gerektirebilir. Android'de SSL ile çalışma hakkında daha fazla bilgi için SSL kötüye kullanımlarına karşı koruma sağlamak için güvenlik sağlayıcınızı güncelleme bölümüne bakı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

Bir *VehicleReporter örneği oluşturduktan sonra, 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 internete bağlı olduğunu da gösterir.

Varsayılan olarak raporlama aralığı 10 saniyedir ancak raporlama aralığını FleetEngine.setLocationReportingInterval(long, TimeUnit) ile değiştirebilirsiniz. Desteklenen minimum güncelleme aralığı 5 saniyedir. Daha sık güncelleme yapmak, daha yavaş isteklere ve hatalara neden olabilir.

Konum güncellemelerini devre dışı bırak

Sürücünün vardiyası bittiğinde, DeliveryVehicleReporter.disableLocationTracking numarası aranarak konum güncellemeleri durdurulabilir.

Güvenilir model kullanım alanları

Bu bölümde, güvenilir model kullanılırken yaygın kullanım alanlarını uygulamak için Driver SDK'sının nasıl kullanılacağı açıklanmaktadır.

Araç oluştur

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, Driver SDK'sı başlatma sırasında kullanılan araç ve sağlayıcı kimlikleriyle oluşturulmalıdır. Daha 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.
}

Kargo teslim alma görevi oluşturma

Sürücü SDK'sından kargo teslim alma görevi oluşturabilirsiniz.

Görev oluşturmadan önce Delivery Driver API'yi başlattığınızdan emin olun. Görev, Driver SDK'sını başlatma 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 kargo teslim alma görevini oluşturun. Görev kimlikleri hakkında bilgi edinmek için Görev kimliği örnekleri başlıklı makaleye 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_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 kargo teslimatı görevi oluşturabilirsiniz.

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 kargo teslimatı görevini oluşturun. Görev kimlikleri hakkında bilgi edinmek 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

Driver SDK'dan mevcut olmadığını gösteren (örneğin, sürücü arızaları veya araçta yakıt doldurma için) bir görev oluşturabilirsiniz. Planlanmış bir kullanılabilir olmama görevi, bir izleme kimliği içermemelidir. İsterseniz bir konum da belirtebilirsiniz.

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 "kullanmama" görevini oluşturun. Görev kimlikleri hakkında bilgi edinmek 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 planlanmış bir durdurma görevi oluşturabilirsiniz. Planlanmış bir durdurma görevi, izleme kimliği içeremez.

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, planlanan durdurma görevini oluşturun. Görev kimlikleri hakkında bilgi edinmek 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üncelleyin

Driver SDK'sından bir araca atanan görevlerin yürütülme sırasını güncelleyebilirsiniz.

Görev sıralaması güncellendiğinde, daha önce bir araca atanmamışsa görevler de araca atanır. Ayrıca daha önce bir araca atanan ve güncellenmiş sıralamanın dışında kalan görevleri de kapatır. Daha önce başka bir araca atanmış olan farklı bir araca görev atamak hataya neden olur. Yeni araca bir görev atamadan önce, mevcut görevi kapatıp 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şturulmuş olduğundan emin olun. Ardından, araç için görev sıralamasını aşağıdaki örnekte gösterildiği gibi 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.
}

Driver SDK'sının dahili durumunda güncellemeyi engelleyebilecek bir istisna oluşabilir. Bu durumda sorunu çözün. Ardından, arama başarılı olana kadar setVehicleStops numarasını tekrar arayın.

Olası sorunlar arasında şunlar yer alabilir:

  • Belirtilen VehicleStops geçerli bir kalıp izlemiyor. VehicleStopStates herhangi birinde yalnızca ilk VehicleStop olabilir: NEW, ENROUTE veya ARRIVED. Mevcut duraktan sonraki VehicleStop'lar YENİ VehicleStopState içinde olmalıdır.

  • Görevler mevcut değil veya farklı bir araca ait.

  • Araç mevcut değil.

Araç sonraki durakta

Bir araç duraktan ayrıldığında ve navigasyon başladığında Fleet Engine'e bildirim verilmelidir. Fleet Engine'e, Sürücü SDK'sı üzerinden bildirim gönderebilirsiniz.

Fleet Engine'e bir aracın duraktan ayrıldığını bildirmeden önce araç durmaları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 kalkışı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.
}

Driver SDK'sının dahili durumunda güncellenmesini engelleyebilecek bir istisna oluşabilir. Bu durumda sorunu çözün. Ardından, işlem başarılı olana kadar enrouteToNextStop hizmetini tekrar arayın.

Olası sorunlar arasında şunlar yer alabilir:

  • Driver SDK'sında ayarlanmış kalan VehicleStops yok.

Araç durağa geldiğinde

Bir araç durağa geldiğinde Fleet Engine'e bilgi verilmelidir. Fleet Engine'e Driver SDK'sından bildirim gönderebilirsiniz.

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 Fleet Engine'e aracın durağa vardığı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.
// 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.
}

Driver SDK'sının dahili durumunda güncelleme yapılmasını engelleyebilecek bir istisna oluşabilir. Bu durumda sorunu çözün ve işlem başarılı olana kadar arrivedAtStop hizmetini tekrar arayın.

Olası sorunlar şunları içerebilir:

  • Driver SDK'sında ayarlanmış kalan VehicleStops yok.

Araç durma işlemini tamamlar

Bir araç durma işlemini tamamladığında Fleet Engine'e bilgi verilmelidir. Bu, durakla ilişkili tüm görevlerin KAPALI durumuna ayarlanmasına neden olur. Fleet Engine'e Driver SDK'sından bildirim gönderebilirsiniz.

Fleet Engine'e, aracın aşağıdaki örnekte gösterildiği gibi Araç Durdurma işlemini tamamladığını 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.
}

Driver SDK'sının dahili durumunda güncelleme yapılmasını engelleyebilecek bir istisna oluşabilir. Bu durumda sorunu çözün ve işlem başarılı olana kadar completedStop hizmetini tekrar arayın.

Olası sorunlar arasında şunlar yer alabilir:

  • Driver SDK'sında ayarlanmış kalan VehicleStops yok.

Görevi kapatma

Bir araca atanan bir görevi kapatmak için Fleet Engine'e, aracın görevin gerçekleştiği yerde durduğunu bildirin veya aracı araç durakları listesinden kaldırın. Bunu yapmak için kalan araç duraklarının listesini, bir araç için görev sıralamasını güncellerken olduğu gibi ayarlayabilirsiniz.

Bir göreve henüz araç atanmamışsa ve kapatılması gerekiyorsa görevi KAPALI durumuna güncelleyin. Ancak KAPALI bir görevi yeniden açamazsınız.

Bir görevin kapatılması, başarılı veya başarısız olduğu anlamına gelmez. Görevin artık devam ediyor olarak kabul edilmediğini gösterir. Sevkiyat takibinde, teslimat sonucunun gösterilebilmesi için bir görevin gerçek sonucunu belirtmek önemlidir.

Driver SDK'sını kullanarak görevi kapatabilmek için bir araca görev atanmalıdır. Bir araca atanan bir görevi kapatmak için Fleet Engine'e, aracın görevin gerçekleştiği yerde durmayı tamamladığını bildirin.

Alternatif olarak, görevin atandığı aracın görev sıralamasını güncelleyebilir ve ardından istenen görevi durak listesinden kaldırabilirsiniz.

Görevin sonucunu ve sonucun yerini belirleyin

Bir görevin kapatılması, başarılı veya başarısız olduğu anlamına gelmez. Görevin artık devam ediyor olarak kabul edilmediğini gösterir. Gönderim takibinde, bir teslimat sonucunun gösterilebilmesi için bir görevin gerçek sonucunu belirtmek ve bu sayede hizmetler için faturalandırmanın doğru olmasını sağlamak önemlidir. Bir kez ayarlandıktan sonra görev sonucu değiştirilemez. Ancak görevleri belirledikten sonra görev sonucu zamanını ve görev sonucu konumunu değiştirebilirsiniz.

KAPALI durumdaki görevlerin sonuçları BAŞARILI veya BAŞARISIZ olarak ayarlanabilir. Fleet Engine, yalnızca SUCCEEDED durumundaki teslimat görevlerini ücretlendirir.

Fleet Engine, bir görevin sonucunu işaretlerken görev sonucu konumunu bilinen son araç konumuyla otomatik olarak doldurur. Fleet Engine'i çağırarak bu davranışı geçersiz kılabilirsiniz. Driver SDK'sını kullanarak görev sonucu konumunu ayarlayamayacağınızı unutmayın.

Aşağıdaki kod örneğinde, görev sonucunu ve zaman damgasını ayarlamak için Driver SDK'nın nasıl kullanılacağı gösterilmektedir.

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ç arayın

Sürücü SDK'sından araç arayabilirsiniz. Bir aracı aramadan önce Teslimat Sürücü API'sini ilk kullanıma hazırladığı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ği için DeliveryVehicle öğesini arayabilir.