最低系统要求
移动设备必须搭载 Android 6.0(API 级别 23)或更高版本。
构建和依赖项配置
Google Maven 制品库中提供驱动程序 SDK 4.99 版及更高版本。
Gradle
请将以下内容添加到 build.gradle
文件:
repositories {
...
google()
}
Maven
请将以下内容添加到 pom.xml
文件:
<project>
...
<repositories>
<repository>
<id>google-maven-repository</id>
<url>https://maven.google.com</url>
</repository>
</repositories>
...
</project>
项目配置
如需使用驱动程序 SDK,您的应用必须以 minSdkVersion
23 或更高版本为目标平台。如需了解详情,请参阅版本说明。
如需运行使用驱动程序 SDK 构建的应用,Android 设备必须安装 Google Play 服务。
设置您的开发项目
如需在 Google Cloud 控制台中设置您的开发项目并获取项目的 API 密钥,请执行以下操作:
创建新的 Google Cloud Console 项目,或者选择一个现有项目,以便与驱动程序 SDK 搭配使用。等待几分钟,直到新项目显示在 Google Cloud 控制台中。
为了运行该演示版应用,您的项目必须有权访问 Maps SDK for Android。在 Google Cloud 控制台中,依次选择 API 和服务 > 库,然后搜索并启用 Maps SDK for Android。
依次选择 API 和服务 > 凭据 > 创建凭据 > API 密钥,获取项目的 API 密钥。 如需详细了解如何获取 API 密钥,请参阅获取 API 密钥。
将驱动程序 SDK 添加到您的应用
驱动程序 SDK 可从 Google Maven 制品库中获取。该代码库包含 SDK 的项目对象模型 (.pom) 文件和 Javadocs。如需将驱动程序 SDK 添加到您的应用,请执行以下操作:
将以下依赖项添加到您的 Gradle 或 Maven 配置中,并将
VERSION_NUMBER
占位符替换为所选驱动程序 SDK 版本。Gradle
将以下内容添加到
build.gradle
中:dependencies { ... implementation 'com.google.android.libraries.mapsplatform.transportation:transportation-driver:VERSION_NUMBER' }
Maven
将以下内容添加到
pom.xml
中:<dependencies> ... <dependency> <groupId>com.google.android.libraries.mapsplatform.transportation</groupId> <artifactId>transportation-driver</artifactId> <version>VERSION_NUMBER</version> </dependency> </dependencies>
驱动程序 SDK 依赖于 Navigation SDK,此依赖项的配置方式如下:如果需要特定版本的 Navigation SDK,您需要在 build 配置文件中明确定义它(如下所示),省略上述代码块可让项目始终下载主要发布版本中的 Navigation SDK 的最新版本。 请注意,最新版本的驱动程序 SDK 和 Navigation SDK 在发布之前都经过了严格的测试。
相应地安排开发和发布环境的依赖项配置。
Gradle
将以下内容添加到
build.gradle
中:dependencies { ... implementation 'com.google.android.libraries.navigation:navigation:5.0.0' }
Maven
将以下内容添加到
pom.xml
中:<dependencies> ... <dependency> <groupId>com.google.android.libraries.navigation</groupId> <artifactId>navigation</artifactId> <version>5.0.0</version> </dependency> </dependencies>
更新应用的清单
将驱动程序 SDK 添加到应用后,您可以通过修改应用的 AndroidManifest.xml
文件来更新应用的清单。
在 <application>
元素中添加您的 API 密钥。您必须使用在设置开发项目时获得的项目 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,则必须在应用的法律声明部分包含提供方说明文本和开源许可。最好将提供方说明作为独立的菜单项或关于菜单项的一部分进行添加。
您可以在未归档的 AAR 文件中的“third_party_licenses.txt”文件中找到许可信息。
如需了解如何添加开源声明,请参阅 https://developers.google.com/android/guides/opensource。
依赖项
驱动程序 SDK 使用 gRPC 与 Fleet Engine 服务器通信。如果您尚未引入 gRPC,则可能需要声明以下依赖项:
dependencies {
implementation 'io.grpc:grpc-android:1.12.0'
implementation 'io.grpc:grpc-okhttp:1.12.0'
}
如果没有这些依赖项,驱动程序 SDK 将在运行时尝试与 Fleet Engine 服务器通信时遇到错误。
如果您使用 ProGuard 优化 build,可能需要将以下行添加到 ProGuard 配置文件中:
-dontwarn com.google.**
-dontwarn io.grpc.**
-dontwarn okio.**
支持的最低 API 级别为 23。
初始化 SDK
必须提供提供方 ID(通常是 Google Cloud 项目 ID)才能初始化 FleetEngine 对象。如需详细了解如何设置 Google Cloud 项目,请参阅身份验证和授权。
在使用驱动程序 SDK 之前,您必须先初始化 Navigation SDK。要初始化 SDK,请执行以下操作:
从
NavigationApi
获取Navigator
对象。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);
从 API 对象获取
DeliveryVehicleReporter
。 (DeliveryVehicleReporter
扩展了NavigationVehicleReporter
。)DeliveryVehicleReporter vehicleReporter = driverApi.getDeliveryVehicleReporter();
使用 AuthTokenFactory
进行身份验证
当驱动程序 SDK 生成位置信息更新时,必须将这些更新发送到 Google Fleet Engine 服务器。为了对这些请求进行身份验证,驱动程序 SDK 会调用调用方提供的 AuthTokenFactory
实例。工厂负责在位置信息更新时生成身份验证令牌。
生成令牌的具体方式取决于每个开发者的具体情况。不过,该实现可能需要执行以下操作:
- 从 HTTPS 服务器提取身份验证令牌(可能是 JSON 格式)。
- 解析并缓存令牌。
- 在令牌过期时刷新令牌。
如需详细了解 Fleet Engine 服务器预期的令牌,请参阅创建 JSON Web 令牌 (JWT) 进行授权。
以下是 AuthTokenFactory 的框架实现:
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);
}
}
}
此特定实现使用内置 Java HTTP 客户端从开发者的身份验证服务器中提取 JSON 格式的令牌。系统会保存令牌以供重复使用。如果旧令牌在过期时间在 10 分钟内,则重新获取令牌。
您的实现可能会以不同的方式执行操作,例如使用后台线程刷新令牌。
除非重复发生,否则 AuthTokenFactory
中的异常会被视为暂时异常。尝试多次后,驱动程序 SDK 会假定错误是永久性的,并停止尝试发送更新。
StatusListener
的状态和 Error Reporting
由于驱动程序 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 注意事项
在内部,驱动程序 SDK 实现使用 SSL/TLS 与 Fleet Engine 服务器进行安全通信。较低版本的 Android(API 版本 23 或更低版本)可能需要使用 SecurityProvider
补丁才能与服务器通信。如需详细了解如何在 Android 中使用 SSL,请参阅更新您的安全提供程序以防范 SSL 攻击。本文还包含用于为安全提供程序打补丁的代码示例。
启用位置信息更新
有了 *VehicleReporter
实例后,就可以轻松启用位置信息更新:
DeliveryVehicleReporter reporter = ...;
reporter.enableLocationTracking();
如果可能,定期发送位置更新。每次位置信息更新还表示车辆已联网。
默认情况下,报告间隔为 10 秒,但您可以使用 FleetEngine.setLocationReportingInterval(long, TimeUnit)
更改报告间隔。支持的最短更新间隔为 5 秒。更频繁的更新可能会导致请求和错误变慢。
停用位置信息更新
换档完成后,可通过调用 DeliveryVehicleReporter.disableLocationTracking
停止位置信息更新。
可信模型用例
本部分介绍如何使用驱动程序 SDK 实现使用可信模型时的常见用例。
创建车辆
您可以通过 Driver SDK 创建车辆。
制作车辆之前,请务必初始化 Delivery Driver API。必须使用在驱动程序 SDK 初始化期间使用的车辆 ID 和提供商 ID 创建车辆 ID。然后创建车辆,如以下示例所示:
DeliveryDriverApi api = DeliveryDriverApi.getInstance();
DeliveryVehicleManager vehicleManager = api.getDeliveryVehicleManager();
try {
DeliveryVehicle vehicle = vehicleManager.createVehicle().get();
// Handle CreateVehicleRequest DeliveryVehicle response.
} catch (Exception e) {
// Handle CreateVehicleRequest error.
}
创建货物自提任务
您可以通过驱动程序 SDK 创建货物自提任务。
在创建任务之前,请务必初始化 Delivery Driver API。必须使用驱动程序 SDK 初始化期间指定的提供方 ID 创建任务。然后创建运单自提任务,如以下示例所示。如需了解任务 ID,请参阅任务 ID 示例。
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.
}
创建货运配送任务
您可以通过驱动程序 SDK 创建货运配送任务。
在创建任务之前,请务必初始化 Delivery Driver API。然后创建运单配送任务,如以下示例所示。如需了解任务 ID,请参阅任务 ID 示例。
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.
}
计划不可用
您可以通过驱动程序 SDK 创建指示不可用的任务(例如,司机中断或车辆加油)。已安排的不可用任务不得包含跟踪 ID。您可以选择提供位置信息。
在创建任务之前,请务必初始化 Delivery Driver API。然后创建不可用任务,如以下示例所示。 如需了解任务 ID,请参阅任务 ID 示例。
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.
}
计划的经停点
您可以通过驱动程序 SDK 创建计划停止任务。计划停止任务不能包含跟踪 ID。
在创建任务之前,请务必初始化 Delivery Driver API。然后创建计划停止任务,如以下示例所示。如需了解任务 ID,请参阅任务 ID 示例。
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.
}
更新任务排序
您可以通过驱动程序 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.
}
可能会发生异常,可能会导致无法更新驱动程序 SDK 的内部状态。如果发生这种情况,请解决该问题,然后再次调用 setVehicleStops
,直到调用成功为止。
潜在问题可能包括:
指定的 VehicleStop 未遵循有效模式。只有第一个 VehicleStop 处于以下任何 VehicleStopState:NEW、ENROUTE 或 ARRIVED。当前停靠站之后的 VehicleStop 必须位于 NEW VehicleStopState。
任务不存在或属于其他车辆。
车辆不存在。
车辆正在前往下一个经停点
当车辆离开站点以及开始导航时,Fleet Engine 必须收到通知。您可以通过驱动程序 SDK 通知 Fleet Engine。
在通知 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.
}
可能会发生异常,可能会导致无法更新驱动程序 SDK 的内部状态。如果发生这种情况,请解决问题,然后再次调用 enrouteToNextStop
,直到成功为止。
潜在问题可能包括:
- 驱动程序 SDK 中未设置剩余
VehicleStops
。
车辆抵达一个经停点
Fleet Engine 必须在有车辆到达停车点时收到通知。您可以通过驱动程序 SDK 通知 Fleet Engine。
在通知 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.
}
可能会出现异常,该异常可能会阻止更新驱动程序 SDK 的内部状态。如果发生这种情况,请解决该问题,然后再次调用 arrivedAtStop
,直到成功。
潜在问题可能包括:
- 驱动程序 SDK 中未设置剩余
VehicleStops
。
车辆停靠一站
当车辆停止时,Fleet Engine 必须收到通知。这会使与停止操作相关的所有任务都设置为“已关闭”状态。您可以通过驱动程序 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.
}
可能会出现异常,该异常可能会阻止更新驱动程序 SDK 的内部状态。如果发生这种情况,请解决该问题,然后再次调用 completedStop
,直到成功。
潜在问题可能包括:
- 驱动程序 SDK 中未设置剩余
VehicleStops
。
关闭任务
如需关闭已分配给车辆的任务,请通知 Fleet Engine 车辆已完成执行任务所在的经停点,或将其从车辆经停点列表中移除。为此,您可以设置剩余车辆经停点列表,就像更新车辆的任务排序时一样。
如果任务尚未分配车辆,并且需要关闭,请将任务更新为“已关闭”状态。但是,您无法重新打开已关闭的任务。
关闭任务并不表示操作成功或失败。它表示任务不再被视为正在进行。对于物流跟踪,请务必指明任务的实际结果,以便显示送货结果。
必须将任务分配给车辆,才能使用驱动程序 SDK 关闭任务。如需关闭已分配给车辆的任务,请通知 Fleet Engine 车辆已在发生任务的位置停止运行。
或者,您也可以为分配给该任务的车辆更新任务排序,然后从停靠站列表中移除所需任务。
设置任务结果和结果位置
关闭任务并不表示成功或失败。它表示任务不再被视为正在进行。对于货运跟踪,请务必指明任务的实际结果,以便显示送货结果,并为服务设定适当的结算。任务结果一经设置便无法更改。不过,您可以在设置任务结果时间和任务结果位置后对其进行修改。
处于 CLOSED 状态的任务可以将其结果设置为 SUCCEEDED 或 FAILED。Fleet Engine 仅对状态为 SUCCEEDED 的交付任务收费。
标记任务结果时,Fleet Engine 会自动使用最近一次的已知车辆位置填充任务结果位置。您可以通过调用 Fleet Engine 来替换此行为。请注意,您无法使用驱动程序 SDK 设置任务结果位置。
以下代码示例演示了如何使用驱动程序 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 查找车辆。在查找车辆之前,请务必初始化 Delivery Driver 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
只能查找在 Delivery Driver API 初始化期间提供的车辆 ID 的 DeliveryVehicle
。