Начало работы с Driver SDK для Android,Начало работы с Driver SDK для Android

Минимальные системные требования

Мобильное устройство должно работать под управлением Android 6.0 (уровень API 23) или более поздней версии.

Конфигурация сборки и зависимостей

Driver SDK версии 4.99 и более поздних версий доступен в репозитории Google Maven.

Градл

Добавьте в файл build.gradle следующее:

repositories {
    ...
    google()
}

Мавен

Добавьте в файл pom.xml следующее:

<project>
  ...
  <repositories>
    <repository>
      <id>google-maven-repository</id>
      <url>https://maven.google.com</url>
    </repository>
  </repositories>
  ...
</project>

Конфигурация проекта

Чтобы использовать Driver SDK, ваше приложение должно быть нацелено на minSdkVersion 23 или выше. Дополнительные сведения см. в Примечаниях к выпуску .

Чтобы запустить приложение, созданное с помощью Driver SDK, на устройстве Android должны быть установлены службы Google Play .

Настройте свой проект разработки

Чтобы настроить проект разработки и получить ключ API для проекта в Google Cloud Console:

  1. Создайте новый проект Google Cloud Console или выберите существующий проект для использования с Driver SDK. Подождите несколько минут, пока новый проект не появится в Google Cloud Console.

  2. Чтобы запустить демонстрационное приложение, у вашего проекта должен быть доступ к Maps SDK для Android. В Google Cloud Console выберите API и службы > Библиотека , затем найдите и включите Maps SDK для Android.

  3. Получите ключ API для проекта, выбрав API и службы > Учетные данные > Создать учетные данные > Ключ API . Дополнительную информацию о получении ключа API см. в разделе Получение ключа API .

Добавьте Driver SDK в свое приложение

Driver SDK доступен в репозитории Google Maven. Репозиторий включает файлы объектной модели проекта SDK (.pom) и документацию Javadocs. Чтобы добавить Driver SDK в ваше приложение:

  1. Добавьте следующую зависимость в конфигурацию Gradle или Maven, заменив заполнитель VERSION_NUMBER выбранной версией Driver SDK.

    Градл

    Добавьте следующее в свой build.gradle :

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

    Мавен

    Добавьте следующее в ваш pom.xml :

    <dependencies>
      ...
      <dependency>
        <groupId>com.google.android.libraries.mapsplatform.transportation</groupId>
        <artifactId>transportation-driver</artifactId>
        <version>VERSION_NUMBER</version>
      </dependency>
    </dependencies>
    
  2. Driver SDK зависит от Navigation SDK. Эта зависимость настроена таким образом, что если требуется конкретная версия Navigation SDK, ее необходимо явно определить в файле конфигурации сборки, как показано ниже. Пропуск упомянутого блока кода включит проект. чтобы всегда загружать последнюю версию Navigation SDK в рамках основной версии. Обратите внимание, что совместное поведение последних версий Driver SDK и Navigation SDK прошло тщательное тестирование перед их выпуском.

    Соответствующим образом организуйте конфигурацию зависимостей вашей среды разработки и выпуска.

    Градл

    Добавьте в свой build.gradle следующее:

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

    Мавен

    Добавьте следующее в ваш pom.xml :

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

Обновите манифест вашего приложения

Добавив Driver SDK в свое приложение, вы можете обновить манифест вашего приложения, отредактировав его файл AndroidManifest.xml .

Добавьте свой ключ API в элемент <application> . Вы должны использовать ключ API проекта, полученный при настройке проекта разработки .

Например, замените PASTE_YOUR_API_KEY_HERE своим ключом API в следующих метаданных приложения:

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

В следующем примере показан полный манифест примера приложения:

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

Включите необходимую атрибуцию в свое приложение

Если вы используете Driver SDK в своем приложении, вы должны включить текст указания авторства и лицензии с открытым исходным кодом в раздел юридических уведомлений вашего приложения. Лучше всего включить атрибуцию как независимый пункт меню или как часть пункта меню «О программе» .

Информацию о лицензиях можно найти в файле Third_party_licenses.txt в разархивированном файле AAR.

Инструкции по включению уведомлений об открытом исходном коде см. на странице https://developers.google.com/android/guides/opensource .

Зависимости

Driver SDK использует gRPC для связи с сервером Fleet Engine. Если вы еще не внедрили gRPC, вам может потребоваться объявить следующие зависимости:

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

Без этих зависимостей Driver SDK будет испытывать ошибки во время выполнения при попытке связаться с сервером Fleet Engine.

Если вы используете ProGuard для оптимизации своих сборок, вам может потребоваться добавить следующие строки в файл конфигурации ProGuard:

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

Минимальный поддерживаемый уровень API — 23.

Инициализируйте SDK

Идентификатор поставщика (обычно идентификатор проекта Google Cloud) необходим для инициализации объекта FleetEngine. Более подробную информацию о настройке проекта Google Cloud см. в разделе Аутентификация и авторизация .

Перед использованием Driver SDK необходимо сначала инициализировать Navigation SDK. Чтобы инициализировать SDK:

  1. Получите объект Navigator из NavigationApi .

    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. Создайте объект DriverContext , заполнив необходимые поля.

    DriverContext driverContext = DriverContext.builder(application)
                 .setProviderId(providerId)
                 .setVehicleId(vehicleId)
                 .setAuthTokenFactory(authTokenFactory)
                 .setNavigator(navigator)
                 .setRoadSnappedLocationProvider(
                     NavigationApi.getRoadSnappedLocationProvider(application))
                 .build()
    
  3. Используйте объект DriverContext для инициализации *DriverApi .

    DeliveryDriverApi driverApi = DeliveryDriverApi.createInstance(driverContext);
    
  4. Получите DeliveryVehicleReporter из объекта API. ( DeliveryVehicleReporter расширяет NavigationVehicleReporter .)

    DeliveryVehicleReporter vehicleReporter = driverApi.getDeliveryVehicleReporter();
    

Аутентификация с помощью AuthTokenFactory

Когда Driver SDK генерирует обновления местоположения, он должен отправлять эти обновления на сервер Google Fleet Engine. Для аутентификации этих запросов Driver SDK обращается к экземпляру AuthTokenFactory , предоставленному вызывающей стороной. Фабрика отвечает за создание токенов аутентификации во время обновления местоположения.

То, как именно генерируются токены, зависит от ситуации каждого разработчика. Однако реализация, вероятно, потребует:

  • Получите токен аутентификации, возможно, в формате JSON, с сервера HTTPS.
  • Разберите и кэшируйте токен.
  • Обновите токен по истечении срока его действия.

Подробную информацию о токенах, ожидаемых сервером Fleet Engine, см. в разделе Создание веб-токена JSON (JWT) для авторизации .

Вот скелет реализации AuthTokenFactory:

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);
    }
  }
}

В этой конкретной реализации используется встроенный HTTP-клиент Java для получения токена в формате JSON с сервера аутентификации разработчика. Токен сохраняется для повторного использования. Токен извлекается повторно, если срок действия старого токена истекает в течение 10 минут.

Ваша реализация может работать по-другому, например использовать фоновый поток для обновления токенов.

Исключения в AuthTokenFactory рассматриваются как временные, если они не происходят повторно. После нескольких попыток Driver SDK предполагает, что ошибка является постоянной, и прекращает попытки отправлять обновления.

Отчеты о статусе и ошибках с помощью StatusListener

Поскольку Driver SDK выполняет действия в фоновом режиме, используйте StatusListener для запуска уведомлений при возникновении определенных событий, таких как ошибки, предупреждения или сообщения отладки. Ошибки могут быть временными по своей природе (например, BACKEND_CONNECTIVITY_ERROR ) или могут привести к постоянной остановке обновления местоположения (например, VEHICLE_NOT_FOUND , что указывает на ошибку конфигурации).

Вы предоставляете дополнительную реализацию StatusListener , подобную следующей:

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

Внутри реализация Driver SDK использует SSL/TLS для безопасного взаимодействия с сервером Fleet Engine. Более ранние версии Android (версии API 23 или более ранние) могут потребовать исправления SecurityProvider для связи с сервером. Дополнительные сведения о работе с SSL в Android см. в разделе Обновление поставщика безопасности для защиты от эксплойтов SSL . Статья также содержит примеры кода для исправления поставщика безопасности.

Включить обновление местоположений

Если у вас есть экземпляр *VehicleReporter , включить обновление местоположений очень просто:

DeliveryVehicleReporter reporter = ...;

reporter.enableLocationTracking();

Обновления местоположения отправляются по возможности через регулярные промежутки времени. Каждое обновление местоположения также указывает на то, что автомобиль находится в сети.

По умолчанию интервал отчетов составляет 10 секунд, но вы можете изменить интервал отчетов с помощью FleetEngine.setLocationReportingInterval(long, TimeUnit) . Минимальный поддерживаемый интервал обновления составляет 5 секунд. Более частые обновления могут привести к замедлению запросов и ошибкам.

Отключить обновление местоположения

После завершения смены водителя обновление местоположений можно остановить, вызвав DeliveryVehicleReporter.disableLocationTracking .

Варианты использования доверенной модели

В этом разделе описывается, как использовать Driver SDK для реализации распространенных случаев использования доверенной модели .

Создать автомобиль

Вы можете создать автомобиль из Driver SDK.

Прежде чем создавать транспортное средство, обязательно инициализируйте API-интерфейс Delivery Driver . Идентификатор транспортного средства должен быть создан на основе идентификаторов транспортного средства и поставщика, использованных во время инициализации Driver SDK. Затем создайте транспортное средство, как показано в следующем примере:

DeliveryDriverApi api = DeliveryDriverApi.getInstance();
DeliveryVehicleManager vehicleManager = api.getDeliveryVehicleManager();
try {
  DeliveryVehicle vehicle = vehicleManager.createVehicle().get();
  // Handle CreateVehicleRequest DeliveryVehicle response.
} catch (Exception e) {
  // Handle CreateVehicleRequest error.
}

Создайте задачу получения груза

Вы можете создать задачу получения груза с помощью Driver SDK.

Прежде чем создавать задачу, обязательно инициализируйте API драйвера доставки . Задача должна быть создана с использованием идентификатора поставщика, указанного при инициализации Driver SDK. Затем создайте задачу получения груза, как показано в следующем примере. Информацию об идентификаторах задач см. в разделе Примеры идентификаторов задач .

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

Создайте задачу доставки отправления

Вы можете создать задачу доставки груза из Driver SDK.

Прежде чем создавать задачу, обязательно инициализируйте API драйвера доставки . Затем создайте задачу доставки груза, как показано в следующем примере. Информацию об идентификаторах задач см. в разделе Примеры идентификаторов задач .

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

Запланированная недоступность

Создать задачу с указанием недоступности (например, для перерыва водителя или заправки автомобиля) можно из Driver SDK. Запланированная задача недоступности не должна включать идентификатор отслеживания. При желании вы можете указать местоположение.

Прежде чем создавать задачу, обязательно инициализируйте API драйвера доставки . Затем создайте задачу недоступности, как показано в следующем примере. Информацию об идентификаторах задач см. в разделе Примеры идентификаторов задач .

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

Запланированные остановки

Вы можете создать задачу плановой остановки из Driver SDK. Задача запланированной остановки не может включать идентификатор отслеживания.

Прежде чем создавать задачу, обязательно инициализируйте API драйвера доставки . Затем создайте задачу запланированной остановки, как показано в следующем примере. Информацию об идентификаторах задач см. в разделе Примеры идентификаторов задач .

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

Обновить порядок задач

Вы можете обновить порядок выполнения задач, назначенных транспортному средству, из Driver SDK.

Обновление порядка задач также назначает задачи транспортному средству, если они ранее не были назначены транспортному средству. Он также закрывает задачи, которые ранее были назначены транспортному средству и не включены в обновленный порядок. Назначение задачи другому транспортному средству, если оно ранее было назначено другому транспортному средству, приводит к ошибке. Прежде чем назначать задачу новому транспортному средству, закройте существующую задачу, а затем создайте новую задачу.

Вы можете обновить порядок задач в любое время.

Прежде чем обновлять порядок задач для автомобиля, убедитесь, что автомобиль и задачи уже созданы в Fleet Engine. Затем обновите порядок задач для автомобиля, как показано в следующем примере.

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. Если это произойдет, устраните проблему, а затем снова вызывайте setVehicleStops , пока вызов не будет успешным.

Потенциальные проблемы могут включать в себя:

  • Указанные VehicleStops не соответствуют допустимому шаблону. Только первый VehicleStop может находиться в любом из состояний VehicleStopState: NEW, ENROUTE или ARRIVED. VehicleStops после текущей остановки должен находиться в состоянии NEW VehicleStopState.

  • Задачи либо не существует, либо они принадлежат другому аппарату.

  • Транспортное средство не существует.

Транспортное средство движется к следующей остановке

Fleet Engine должен быть уведомлен, когда транспортное средство отходит от остановки и когда оно начинает навигацию. Вы можете уведомить Fleet Engine из Driver SDK.

Прежде чем уведомлять Fleet Engine об отъезде транспортного средства с остановки, убедитесь, что остановки транспортного средства созданы и установлены. Затем уведомите Fleet Engine об отъезде транспортного средства, как показано в следующем примере.

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. Если это произойдет, устраните проблему, а затем снова вызывайте enrouteToNextStop , пока операция не завершится успешно.

Потенциальные проблемы могут включать в себя:

  • В Driver SDK не осталось VehicleStops .

Транспортное средство подъезжает к остановке

Fleet Engine должен быть уведомлен, когда транспортное средство прибывает на остановку. Вы можете уведомить Fleet Engine из Driver SDK.

Прежде чем уведомить Fleet Engine о прибытии транспортного средства на остановку, убедитесь, что остановки транспортного средства установлены. Затем уведомите Fleet Engine о прибытии транспортного средства на остановку, как показано в следующем примере.

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. Если это произойдет, устраните проблему, а затем снова вызывайте arrivedAtStop , пока операция не завершится успешно.

Потенциальные проблемы могут включать в себя:

  • В Driver SDK не осталось VehicleStops .

Транспортное средство завершает остановку

Fleet Engine должен быть уведомлен, когда транспортное средство завершает остановку. Это приведет к тому, что все задачи, связанные с остановкой, будут переведены в состояние ЗАКРЫТО. Вы можете уведомить Fleet Engine из Driver SDK.

Сообщите Fleet Engine о том, что транспортное средство завершило операцию VehicleStop, как показано в следующем примере.

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. Если это произойдет, устраните проблему, а затем снова вызовите completedStop , пока она не завершится успешно.

Потенциальные проблемы могут включать в себя:

  • В Driver SDK не осталось VehicleStops .

Закрыть задачу

Чтобы закрыть задачу, назначенную транспортному средству, либо уведомите Fleet Engine о том, что транспортное средство завершило остановку, на которой выполняется задание, либо удалите его из списка остановок транспортного средства. Для этого можно настроить список оставшихся остановок транспортных средств так же, как при обновлении задания на транспортное средство.

Если задаче еще не назначен автомобиль и ее необходимо закрыть, обновите задачу до состояния ЗАКРЫТО. Однако вы не можете повторно открыть ЗАКРЫТУЮ задачу.

Закрытие задачи не означает успех или неудачу. Это указывает на то, что задача больше не считается выполняемой. Для отслеживания доставки важно указать фактический результат задачи, чтобы можно было показать результат доставки.

Задача должна быть назначена транспортному средству, чтобы иметь возможность использовать Driver SDK для закрытия задачи. Чтобы закрыть задачу, назначенную транспортному средству, уведомите Fleet Engine о том, что транспортное средство завершило остановку, на которой выполняется задача.

Альтернативно обновите порядок задач транспортного средства, которому назначена задача, а затем удалите нужную задачу из списка остановок.

Установите результат задачи и местоположение результата

Закрытие задачи не означает успех или неудачу. Это указывает на то, что задача больше не считается выполняемой. Для отслеживания доставки важно указать фактический результат задачи, чтобы можно было отобразить результат доставки и обеспечить правильное выставление счетов за услуги. После установки вы не сможете изменить результат задачи. Но вы можете изменить время и местоположение результата задачи после их установки.

Задачи, находящиеся в состоянии ЗАКРЫТО, могут иметь результат либо УСПЕШНО, либо НЕУДАЧНО. Fleet Engine взимает плату только за задачи доставки со статусом УСПЕШНО.

Отмечая результат задачи, Fleet Engine автоматически заполняет местоположение результата задачи последним известным местоположением транспортного средства. Вы можете изменить это поведение, вызвав Fleet Engine. Обратите внимание, что вы не можете установить местоположение результата задачи с помощью Driver SDK.

В следующем примере кода показано, как использовать Driver SDK для установки результата и отметки времени задачи.

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

Найти автомобиль

Вы можете найти автомобиль в Driver SDK. Прежде чем искать транспортное средство, убедитесь, что вы инициализировали API-интерфейс Delivery Driver . Затем вы можете найти автомобиль, как показано в следующем примере.

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 может искать DeliveryVehicle только для идентификатора транспортного средства, который был указан во время инициализации API драйвера доставки.