Минимальные системные требования
Мобильное устройство должно работать под управлением Android 5.0 (уровень API 21) или более поздней версии.
Предпосылки
В этом руководстве предполагается, что ваше приложение уже реализует Navigation SDK , а серверная часть Fleet Engine настроена и доступна.
Driver SDK для Android опубликован в репозитории Maven Artifact Registry . Репозиторий включает файлы объектной модели проекта SDK (.pom) и автономные документы Java.
Получить доступ
Если вы являетесь клиентом Google Workspace, во время регистрации создайте группу Workspace , например google-maps-platform-sdk-users@workspacedomain.com
, и сообщите название Google. Это рекомендуемый подход. Затем ваша рабочая группа будет добавлена в белый список, предоставляющий доступ к репозиторию Maven gmp-artifacts/transportation
. Подтвердите, что адреса электронной почты пользователей и учетных записей служб, которым требуется доступ, включены в этот список.
Если ваша организация не может создавать группы рабочей области, отправьте в Google список адресов электронной почты пользователей и учетных записей служб, которым требуется доступ к этим артефактам.
Местное развитие
Для локальной разработки достаточно авторизоваться с помощью Cloud SDK .
gcloud
gcloud auth login
Электронная почта, используемая для входа, должна быть членом рабочей группы.
Автоматизация (построение систем или непрерывная интеграция)
Настройте хосты автоматизации в соответствии с рекомендациями :
Если ваш процесс выполняется в среде Google Cloud, используйте автоматическое определение учетных данных.
В противном случае сохраните файл ключа учетной записи службы в безопасном месте в файловой системе хоста и соответствующим образом задайте переменную среды GOOGLE_APPLICATION_CREDENTIALS .
Адрес электронной почты сервисной учетной записи, связанный с учетными данными, должен принадлежать группе Workspace.
Конфигурация
Настройте Maven или Gradle для автоматического определения учетных данных пользователя или службы.
Грейдл
Добавьте следующее в файл build.gradle
вашего модуля приложения, а не в файл build.gradle
корневого модуля проекта:
plugins {
id "com.google.cloud.artifactregistry.gradle-plugin" version "2.1.5"
}
repositories {
maven {
url "artifactregistry://us-west2-maven.pkg.dev/gmp-artifacts/transportation"
}
}
Мавен
Добавьте в свой pom.xml
следующее:
<repositories>
<repository>
<id>gmp-artifacts</id>
<url>artifactregistry://us-west2-maven.pkg.dev/gmp-artifacts/transportation</url>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
<build>
<extensions>
<extension>
<groupId>com.google.cloud.artifactregistry</groupId>
<artifactId>artifactregistry-maven-wagon</artifactId>
<version>2.1.0</version>
</extension>
</extensions>
</build>
Сведения о проверке доступа см. в разделе Управление пакетами Java .
Конфигурация проекта
Чтобы использовать Driver SDK, ваше приложение должно быть нацелено на minSdkVersion
21 или выше. Дополнительные сведения см. в примечаниях к выпуску .
Чтобы запустить приложение, созданное с помощью Driver SDK, на устройстве Android должны быть установлены службы Google Play .
Настройте свой проект разработки
Чтобы настроить проект разработки и получить ключ API для проекта в Google Cloud Console:
Создайте новый проект Google Cloud Console или выберите существующий проект для использования с Driver SDK. Подождите несколько минут, пока новый проект не появится в Google Cloud Console.
Чтобы запустить демонстрационное приложение, ваш проект должен иметь доступ к Maps SDK для Android. В Google Cloud Console выберите API и службы > Библиотека , затем найдите и включите Maps SDK для Android.
Получите ключ API для проекта, выбрав API и службы > Учетные данные > Создать учетные данные > Ключ API . Дополнительные сведения о получении ключа API см. в разделе Получение ключа API .
Добавьте Driver SDK в свое приложение
Драйвер SDK доступен через частный репозиторий Maven. Репозиторий включает файлы объектной модели проекта SDK (.pom) и документы Javadocs. Чтобы добавить Driver SDK в ваше приложение:
Настройте свою среду для доступа к хост-репозиторию Maven, как описано в разделе «Конфигурация» .
Добавьте следующую зависимость в конфигурацию 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>
Обновите манифест вашего приложения
После добавления 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 в своем приложении, вы должны включить текст об авторстве и лицензии с открытым исходным кодом в раздел юридических уведомлений вашего приложения. Лучше всего включать атрибуции как независимый пункт меню или как часть пункта меню «О программе» .
Необходимый текст авторства и лицензии с открытым исходным кодом можно найти в zip-файле Driver SDK :
-
NOTICE.txt
-
LICENSES.txt
Зависимости
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 — 21.
Инициализация SDK
Идентификатор поставщика (обычно идентификатор проекта Google Cloud) требуется для инициализации объекта FleetEngine. Дополнительные сведения о настройке Google Cloud Project см. в разделе Аутентификация и авторизация .
Перед использованием Driver SDK необходимо сначала инициализировать Navigation SDK. Чтобы инициализировать SDK:
Получите объект
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; } } );
Создайте объект
DriverContext
, заполнив необходимые поля.DriverContext driverContext = DriverContext.builder(application) .setProviderId(providerId) .setVehicleId(vehicleId) .setAuthTokenFactory(authTokenFactory) .setNavigator(navigator) .setRoadSnappedLocationProvider( NavigationApi.getRoadSnappedLocationProvider(application)) .build()
Используйте объект
DriverContext
для инициализации*DriverApi
.DeliveryDriverApi driverApi = DeliveryDriverApi.createInstance(driverContext);
Получите
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 версии 21 или ниже) может потребоваться исправление SecurityProvider
для возможности связи с сервером. Вы должны прочитать эту статью для получения дополнительной информации о работе с SSL в Android. В статье также содержатся примеры кода для исправления поставщика безопасности.
Включение обновлений местоположения
Если у вас есть экземпляр *VehicleReporter
, включить обновления местоположения несложно:
DeliveryVehicleReporter reporter = ...;
reporter.enableLocationTracking();
Обновления местоположения будут отправляться через регулярные промежутки времени, если это возможно. Каждое обновление местоположения также будет указывать на то, что транспортное средство находится в сети.
По умолчанию интервал отчетов составляет 10 секунд, но интервал отчетов можно изменить с помощью FleetEngine.setLocationReportingInterval(long, TimeUnit)
. Минимальный поддерживаемый интервал обновления составляет 5 секунд. Более частые обновления могут привести к более медленным запросам и ошибкам.
Отключение обновлений местоположения
Когда смена водителя закончена, обновления местоположения можно остановить, вызвав DeliveryVehicleReporter.disableLocationTracking
.
Примеры использования надежных моделей
В этом разделе описывается, как использовать Driver SDK для реализации распространенных вариантов использования доверенной модели .
Создать транспортное средство
Вы можете создать автомобиль из Driver SDK.
Перед созданием транспортного средства обязательно инициализируйте API драйвера доставки . Идентификатор транспортного средства должен быть создан с использованием идентификаторов транспортного средства и поставщика, используемых во время инициализации 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 может находиться в любом из состояний VehicleStop: 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 взимает плату только за задачи доставки с состоянием SUCCEEDED.
Отмечая результат задачи, 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 драйвера доставки . Затем вы можете найти автомобиль, как показано в следующем примере.
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 драйвера доставки.