Android 版 Driver SDK 使用入门

最低系统要求

移动设备必须搭载 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 服务 已安装。

设置您的开发项目

设置您的开发项目并获取 API 密钥 在 Google Cloud 控制台中为项目指定权限:

  1. 创建新的 Google Cloud 控制台 或选择现有项目 驱动程序 SDK。等待几分钟,直到 新项目即会显示在 Google Cloud 控制台中。

  2. 为了运行演示版应用,您的项目必须有权访问 Maps SDK 。在 Google Cloud 控制台中,选择 API 和服务 >库,然后针对 Android。

  3. 通过以下方式获取项目的 API 密钥: API 和服务 >凭据 >创建凭据 >API 密钥。 如需详细了解如何获取 API 密钥,请参阅 获取 API 密钥

将驱动程序 SDK 添加到您的应用

驱动程序 SDK 可从 Google Maven 制品库中获取。通过 代码库包括 SDK 的项目对象模型 (.pom) 文件和 Javadocs。 如需将驱动程序 SDK 添加到您的应用,请执行以下操作:

  1. 将以下依赖项添加到您的 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>
    
  2. 驱动程序 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>

在您的应用中添加必要的提供方说明

如果您在应用中使用驱动程序 SDK,则必须添加 应用的法律声明中的署名文本和开源许可 部分。最好将提供方说明作为独立的菜单项或 (位于关于菜单项中)。

您可以在“third_party_licenses.txt”中找到许可信息。文件 已取消归档的 AAR 文件。

请参阅 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 执行以下操作: 优化构建时,可能需要将以下几行代码添加到 ProGuard 配置文件:

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

支持的最低 API 级别为 23。

初始化 SDK

必须提供提供方 ID(通常是 Google Cloud 项目 ID)才能 初始化 FleetEngine 对象。有关如何设置 Google Cloud 项目,请参阅 身份验证和授权

在使用驱动程序 SDK 之前,您必须先初始化 Navigation SDK。要初始化 SDK,请执行以下操作:

  1. 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;
            }
          }
    );
    
  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. 从 API 对象获取 DeliveryVehicleReporter。 (DeliveryVehicleReporter 扩展了 NavigationVehicleReporter。)

    DeliveryVehicleReporter vehicleReporter = driverApi.getDeliveryVehicleReporter();
    

使用 AuthTokenFactory 进行身份验证

当驱动程序 SDK 生成位置信息更新时, 它必须将这些更新 Google Fleet Engine 服务器。要对这些请求进行身份验证, 驱动程序 SDK 调用由调用方提供的方法 AuthTokenFactory 的实例。 工厂负责在以下位置生成身份验证令牌: 更新时间。

生成令牌的具体方式取决于每个开发者的具体情况。 不过,该实现可能需要执行以下操作:

  • 从 HTTPS 服务器提取身份验证令牌(可能是 JSON 格式)。
  • 解析并缓存令牌。
  • 在令牌过期时刷新。

如需详细了解 Fleet Engine 服务器预期的令牌,请参阅 创建用于授权的 JSON 网络令牌 (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();

如果可能,定期发送位置更新。每个营业地点 update 还表示车辆已联网。

默认情况下,报告间隔为 10 秒,但您可以更改 报告间隔 FleetEngine.setLocationReportingInterval(long, TimeUnit)。最低 支持的更新间隔为 5 秒。更频繁的更新可能会导致 从而降低请求和错误的速度

停用位置信息更新

在驾驶员换档完成后,可通过调用 DeliveryVehicleReporter.disableLocationTracking

可信模型用例

本部分介绍了如何使用驱动程序 SDK 实现常见用例 (使用可信模型时)。

创建车辆

您可以通过 Driver SDK 创建车辆。

在制作车辆之前,请确保 初始化 Delivery Driver API。 创建车辆 ID 时必须使用所用的车辆 ID 和提供商 ID (在驱动程序 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.
}

创建货物自提任务

您可以通过驱动程序 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.
}

计划不可用

您可以创建一个指明服务不可用的任务(例如,为驾驶员创建 中断或车辆加油)。计划不可用 任务不得包含跟踪 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 的内部 state.如果发生这种情况,请先解决问题,然后再次调用 arrivedAtStop 直到成功

潜在问题可能包括:

  • 驱动程序 SDK 中未设置剩余 VehicleStops

车辆停靠一站

当车辆停止时,Fleet Engine 必须收到通知。这会导致 将与停止关联的任务设置为“关闭”状态。您可以通知舰队 引擎。

通知 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 的内部 state.如果发生这种情况,请先解决问题,然后再次调用 completedStop 直到成功

潜在问题可能包括:

  • 驱动程序 SDK 中未设置剩余 VehicleStops

关闭任务

如需关闭已分配给车辆的任务,请通知 Fleet Engine 表示车辆已在停靠点停靠所在位置; 或将其从车辆经停点列表中移除。为此,您可以将 这辆车的下一辆车将会停止 更新车辆的任务排序

如果任务尚未分配车辆且需要关闭,请更新 关闭状态。但是,您无法重新打开已关闭的任务。

关闭任务并不表示操作成功或失败。它表示任务 不再被视为进行中对于货运跟踪,请务必 指示任务的实际结果,以便显示交付结果。

必须将任务分配给车辆,才能使用驱动程序 SDK 关闭任务。如需关闭已分配给车辆的任务,请通知 表示车辆已在发生任务的位置停止的 Fleet Engine。

或者,您也可以更新车辆的任务排序 然后将相应任务从已分配给该任务的列表中删除 停止。

设置任务结果和结果位置

关闭任务并不表示成功或失败。它表示任务 不再被视为进行中要跟踪物流信息,请务必 表示任务的实际结果,以便显示交付结果, 确保服务结算正确无误设置后,您将无法更改 任务结果。但您可以修改任务结果时间和任务结果位置 。

处于“已关闭”状态的任务,其结果可以设置为 SUCCEEDED 或 FAILED。Fleet Engine 仅对状态为 已成功。

标记任务结果时,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 只能查询 DeliveryVehicle