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

Minimum sistem gereksinimleri

Mobil cihaz Android 6.0 sürümünü çalıştırmalıdır (API düzeyi 23) veya üzeri.

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ı

Sürücü SDK'sını kullanmak için uygulamanızın minSdkVersion ülkesini hedeflemesi gerekir 23 veya üzeri. Daha fazla bilgi için bkz. Sürüm Notları.

Sürücü SDK'sı ile oluşturulmuş bir uygulamayı çalıştırmak için Android cihazda 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:

  1. Yeni bir Google Cloud Console oluşturun veya mevcut bir projeyi seçin Sürücü SDK'sı ile. Birkaç dakika bekleyin. Google Cloud Console'da görünür olduğundan emin olun.

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

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

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

Sürücü SDK'sı, Google Maven deposundan edinilebilir. İ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. Sürücü SDK'sını uygulamanıza eklemek için:

  1. Gradle veya Maven yapılandırmanıza şu bağımlılığı ekleyin: yerine VERSION_NUMBER yer tutucusunu Sürücü SDK'sı.

    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.driver</groupId>
        <artifactId>transportation-driver</artifactId>
        <version>[VERSION_NUMBER]</version>
      </dependency>
    </dependencies>
    
  2. Sürücü SDK'sı, Navigasyon SDK'sına bağlıdır. Bu bağımlılık Bu şekilde, belirli bir Gezinme SDK'sı sürümü gerekiyorsa o sürümün aşağıdaki gibi derleme yapılandırma dosyasında açıkça tanımlanır, belirtilen kod bloğunun atlanması, projenin her zaman Navigasyon SDK'sının ana sürüm sürümüne sahip olması gerekir. Driver SDK'nın son sürümlerinin ve bu sürümlerin birlikte çalışan Gezinme SDK'sı, yayınlanmadan önce titiz testlerden geçmiştir.

    Geliştirme ve sürümünüzün bağımlılık yapılandırmasını düzenleyin uygun şekilde düzenlemenizi sağlar.

    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>
    

API anahtarını uygulamanıza ekleyin

Driver SDK'sını uygulamanıza ekledikten sonra API anahtarını uygulamanıza ekleyin. Siz 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. Secrets Gradle eklentisini yüklemek ve güvenli bir şekilde saklamak için bu prosedürü uygulayın. API anahtarınız.

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

    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ü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ştirdiğinizden emin olun.

    MAPS_API_KEY=YOUR_API_KEY
    
  5. AndroidManifest.xml dosyanızda com.google.android.geo.API_KEY adresine gidin ve android: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.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>

Uygulamanıza gerekli ilişkilendirmeleri dahil edin

Uygulamanızda Sürücü SDK'sını kullanıyorsanız uygulamanızın yasal uyarılarının bir parçası olarak atıf metni ve açık kaynak lisansları bölümüne bakın. İ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.

Bağımlılıklar

Sürücü SDK'sı gRPC'yi sunucuyla iletişim kurduğu anlamına gelir. gRPC'yi önceden getirmezseniz aşağıdaki bağımlılıkların belirtilmesi gerekebilir:

dependencies {
    implementation 'io.grpc:grpc-android:1.12.0'
    implementation 'io.grpc:grpc-okhttp:1.12.0'
}

Bu bağımlılıklar olmadan Driver SDK, çalışırken hatalarla karşılaşıyorum sunucuyla iletişim kurmaya çalışırken sorun yaşıyor olabilirsiniz.

ProGuard kullanıyorsanız derlemelerinizi optimize etmek için aşağıdaki satırları ProGuard'a eklemeniz gerekebilir: yapılandırma dosyası:

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

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

SDK'yı başlatma

Şu işlemleri gerçekleştirmek için bir sağlayıcı kimliği (genellikle Google Cloud proje kimliği) gerekir: DriverContext nesnesini başlatın. Chrome Tarayıcı'yı kurma hakkında daha fazla Google Cloud projesi için bkz. Authentication and Authorization (Kimlik Doğrulama ve Yetkilendirme).

Sürücü SDK'sını kullanmadan önce ilk kullanıma hazırlamanız gerekir gezinme SDK'sı. 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 üzerinde kimlik doğrulanıyor

Sürücü SDK'sı konum güncellemeleri oluşturduğunda bu güncellemeleri emin olmaktır. Bu isteklerin kimliğini doğrulamak için Sürücü SDK'sı, arayan tarafından sağlanan bir kullanıcıya çağrıda bulunur AuthTokenFactory örneği. Fabrika, konumda kimlik doğrulama jetonları oluşturmaktan sorumludur güncelleme zamanı.

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 kimlik doğrulama jetonu getirme
  • jetonu ayrıştırıp önbelleğe alın
  • Süresi dolduğunda jetonu yenile

Fleet Engine sunucusunun beklediği jetonların ayrıntıları için bkz. Yetkilendirme için JSON Web Token (JWT) oluşturma.

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

class JsonAuthTokenFactory implements AuthTokenFactory {
  private String vehicleServiceToken;  // initially null
  private long expiryTimeMs = 0;
  private String vehicleId;

  // 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) {
    String vehicleId = requireNonNull(context.getVehicleId());

    if (System.currentTimeMillis() > expiryTimeMs || !vehicleId.equals(this.vehicleId)) {
      // The token has expired, go get a new one.
      fetchNewToken(vehicleId);
    }

    return vehicleServiceToken;
  }

  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;
      this.vehicleId = vehicleId;
    } 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, bir web sitesini jetonunu, geliştiricinin kimlik doğrulama sunucusundan JSON biçiminde kaydetmesini isteyin. Jeton yeniden kullanılmak üzere kaydedildi. Eski jeton 10 dakika içindeyse jeton yeniden getirilir sona ereceğini unutmayın.

Uygulamanız, arka plan ileti dizisi kullanmak gibi bazı işlemleri farklı yapabilir tıklayın.

AuthTokenFactory politikasındaki istisnalar, gerçekleşmedikleri sürece geçici olarak kabul edilir tekrar tekrar. Bir dizi denemeden sonra Sürücü SDK'sı varsayılır ve güncelleme göndermeyi durdurur.

StatusListener ile Durum ve Hata Bildirimi

Sürücü SDK'sı bazı durumlarda bildirimleri tetiklemek için StatusListener hata, uyarı veya hata ayıklama mesajı gibi çeşitli etkinliklerin meydana gelmesidir. Hatalar şunlar olabilir: geçici (BACKEND_CONNECTIVITY_ERROR gibi) veya konum güncellemelerinin kalıcı olarak durdurulmasına neden olur (ör. VEHICLE_NOT_FOUND, Bu bir yapılandırma hatası anlamına gelir).

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. Önceki sürümler (API sürümleri 23 veya önce) ile iletişim kurmak için SecurityProvider yaması gerekebilir. sunucu. Android'de SSL ile çalışma hakkında daha fazla bilgi için bkz. Güvenlik GMS Sağlayıcısı. 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ğiniz olduğunda konum güncellemelerinin etkinleştirilmesi basittir:

DeliveryVehicleReporter reporter = ...;

reporter.enableLocationTracking();

Konum güncellemeleri mümkünse düzenli aralıklarla gönderilir. Her bir konum güncellemesi, aracın internete bağlı olduğunu da gösterir.

Varsayılan olarak raporlama aralığı 10 saniyedir. Raporlama ayarlarını değiştirebilirsiniz reporter.setLocationReportingInterval(long, TimeUnit) ile aralığı. İlgili içeriği oluşturmak için kullanılan desteklenen minimum güncelleme aralığı 5 saniyedir. Güncelleme sıklığı arttıkça daha yavaş istek ve hatalara neden olur.

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

Sürücünün vardiyası bittiğinde, şu numarayı arayarak konum güncellemelerini durdurabilirsiniz: DeliveryVehicleReporter.disableLocationTracking

Güvenilir model kullanım alanları

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

Araç oluştur

Sürücü SDK'sından araç oluşturabilirsiniz.

Araç oluşturmadan önce Delivery Driver API'yi başlatın. Araç kimliği, kullanılan araç ve sağlayıcı kimliğiyle oluşturulmalıdır. . Ardından aracı gösterildiği gibi oluşturun aşağıdaki örnekte:

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 şunları yaptığınızdan emin olun: Delivery Driver API'yi başlatın. Görev, Driver SDK'sı sırasında belirtilen sağlayıcı kimliği kullanılarak oluşturulmalıdır. başlatma. Ardından aşağıda gösterildiği gibi kargo teslim alma görevini oluşturun. örneğine bakalım. 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 şunları yaptığınızdan emin olun: Delivery Driver API'yi başlatın. 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 bkz. Görev kimliği örnekleri.

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

Mevcut olmadığını gösteren bir görev oluşturabilirsiniz (örneğin, sürücü için veya araçta yakıt doldurma) Sürücü SDK'sından kaldırın. Planlanmış bir hizmet dışı kalma durumu görev bir izleme kimliği içermemelidir. İsterseniz bir konum da belirtebilirsiniz.

Görev oluşturmadan önce şunları yaptığınızdan emin olun: Delivery Driver API'yi başlatın. Ardından, aşağıdaki örnekte gösterildiği gibi "kullanmama" görevini oluşturun. Görev kimlikleri hakkında bilgi edinmek için bkz. Görev kimliği örnekleri.

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ış durdurma görevi bir izleme kimliği içermeyebilir.

Görev oluşturmadan önce şunları yaptığınızdan emin olun: Delivery Driver API'yi başlatın. 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 bkz. Görev kimliği örnekleri.

    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

Bir araca atanan görevlerin yürütülme sırasını şuradan güncelleyebilirsiniz: Sürücü SDK'sı.

Görev sıralaması güncellendiğinde, görevde olmayanlar da araca atanır bir araca atanmış olabilir. Ayrıca, önceden yapılmış görevleri de bir araca atandı ve güncellenen sıralamanın dışında bırakıldı. Bir daha önce başka bir araca atanmışsa farklı bir araca hata oluşturur. Yeni araca görev atamadan önce yeni bir görev oluşturabilirsiniz.

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 aracın görev Fleet Engine'de zaten oluşturuldu. Sonra da görev sıralamasını güncelleyin araç için aşağıdaki örnekte gösterildiği gibi.

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

Güncellemeyi engelleyebilecek bir istisna oluşabilir dahili durumuna getirir. Bu durumda, sorunu çözün ve ardından Arama başarılı olana kadar setVehicleStops adlı kişiyi tekrar arayın.

Olası sorunlar arasında şunlar yer alabilir:

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

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

  • Araç mevcut değil.

Araç sonraki durakta

Fleet Engine, bir araç duraktan ayrıldığında ve durduğunda bilgilendirilmelidir. gezinme işlemini başlatır. Fleet Engine'e, Sürücü SDK'sı üzerinden bildirim gönderebilirsiniz.

Filo Motoru'na bir aracın durmadan kalktığını bildirmeden önce Araç durakları oluşturulup ayarlandı. Ardından, Fleet Engine'e aracın kalkışına göre değişiklik gösterir.

    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 durum. Böyle bir durumda sorunu çözüp telefon edin. İşlem başarılı olana kadar enrouteToNextStop tekrar deneyin.

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. Şunları yapabilirsiniz: Sürücü SDK'sından Fleet Engine'e bildirim gönderir.

Fleet Engine'e bir aracın durağa geldiğini bildirmeden önce araç durağı ayarlandı. Ardından Fleet Engine'e aracın vardığını bildir aşağıdaki örnekte gösterildiği gibi durakta.

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 durumu. Böyle bir durumda sorunu çözüp arrivedAtStop numaralı telefonu tekrar arayın. o kadar iyi olur.

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 bildirimde bulunmanız gerekir. Bu bildirim durmasıyla ilişkili tüm görevlerin KAPALI durumuna ayarlanmasına neden olur. Şunları yapabilirsiniz: Sürücü SDK'sından Fleet Engine'e bildirim gönderir.

Filo Motoru'na, aracın aşağıda gösterildiği gibi Araç Durdurma işlemini tamamladığını bildirin aşağıdaki örneğe bakın.

    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 durumu. Böyle bir durumda sorunu çözüp completedStop numaralı telefonu tekrar arayın. o kadar iyi olur.

Olası sorunlar arasında şunlar yer alabilir:

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

Görevi kapatma

Bir araca atanmış bir görevi kapatmak için Fleet Engine'e bildirimde bulunun aracın görevin gerçekleştiği durağı tamamladığını, veya araç durakları listesinden kaldırın. Bunu yapmak için, geriye kalan araç daha az görev sıralamasını güncelleme.

Bir göreve henüz bir araç atanmamışsa ve kapatılması gerekiyorsa görev için KAPALI duruma getirir. 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. Bu, görevin devam eden bir kullanıcı olarak kabul edilmez. Sevkiyat takibi için teslimat sonucunun gösterilebilmesi için görevin asıl sonucunu belirtme.

Sürücü SDK'sını kullanabilmek için bir araca görev atanmalıdır tıklayın. Bir araca atanmış görevi kapatmak için bildirim gönder Filo Motoru, aracın görevin gerçekleştiği yerde durmayı tamamladığını gösterir.

Alternatif olarak aracın görev sıralamasını güncelleyebilirsiniz atamayı seçin ve daha sonra görevi durur.

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. Bu, görevin devam eden bir kullanıcı olarak kabul edilmez. Sevkiyat takibi için teslimat sonucunun gösterilebilmesi için görevin asıl sonucunu belirtmeli ve olmasını şart koşuyoruz. Ayarlandıktan sonra net bir şekilde tanımlamalısınız. Ancak görevlerin sonuç zamanını ve görev sonucu konumunu değiştirebilirsiniz. zaman alır.

KAPALI durumdaki görevlerin sonuçları BAŞARILI veya BAŞARISIZ. Fleet Engine, yalnızca şu durumdaki teslimat görevlerini ücretlendirir: BAŞARILI.

Fleet Engine, bir görevin sonucunu işaretlerken, doğrulama için görev sonucunun bilinen son konumuyla birlikte gösterilir. Bu inceleyeceğiz.

Aşağıdaki örnekte, görev sonucunu belirlemek için Driver SDK'sının nasıl kullanılacağı gösterilmektedir ve zaman damgası. Sürücü SDK'sını kullanarak görev sonucu konumunu 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ç arayın

Sürücü SDK'sından araç arayabilirsiniz. Bir aracı aramadan önce bütçeyi Delivery Driver API'yi başlatın. 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 DeliveryVehicle öğesini arayabilir. Delivery Driver API başlatılırken sağlanan araç kimliği için geçerlidir.