Android용 드라이버 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 키 가져오기 사용자 인증 정보를 제공합니다.

  1. Google Cloud 콘솔 만들기 사용할 기존 프로젝트를 선택하세요. 사용할 수 있습니다 다음 결과가 나올 때까지 몇 분 정도 기다립니다. 새 프로젝트가 Google Cloud 콘솔에 표시됩니다.

  2. 데모 앱을 실행하려면 프로젝트에 Maps SDK에 대한 액세스 권한이 있어야 합니다. 안드로이드용. Google Cloud 콘솔에서 다음을 선택합니다. API 및 서비스 > 라이브러리를 클릭한 다음, Maps SDK for Education을 Android

  3. 다음을 선택하여 프로젝트의 API 키를 가져옵니다. API 및 서비스 > 사용자 인증 정보 > 사용자 인증 정보 만들기 > API 키를 참조하세요. API 키를 가져오는 방법에 대한 자세한 내용은 다음을 참조하세요. API 키를 가져옵니다.

앱에 드라이버 SDK 추가

Driver SDK는 Google Maven 저장소에서 제공됩니다. 이 저장소에는 SDK의 프로젝트 객체 모델 (.pom) 파일과 Javadocs가 포함되어 있습니다. 앱에 드라이버 SDK를 추가하려면 다음 단계를 따르세요.

  1. Gradle 또는 Maven 구성에 다음 종속 항목을 추가합니다. VERSION_NUMBER 자리표시자를 설치해야 합니다

    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.driver</groupId>
        <artifactId>transportation-driver</artifactId>
        <version>[VERSION_NUMBER]</version>
      </dependency>
    </dependencies>
    
  2. 드라이버 SDK는 Navigation SDK에 종속되므로 이 종속 항목은 다음과 같이 구성됩니다. 특정 버전의 Navigation SDK가 필요한 경우 다음과 같이 빌드 구성 파일에 명시적으로 정의되어 있습니다. 언급된 코드 블록을 생략하면 프로젝트가 항상 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>
    

앱에 API 키 추가

앱에 Driver SDK를 추가했으면 앱에 API 키를 추가합니다. 나 API 키를 사용하기 위해 API 키를 사용할 때 개발 프로젝트를 설정합니다.

이 섹션에서는 보다 안전하게 API 키를 저장하는 방법을 설명합니다. 참조됩니다. API 키를 버전에 체크인하면 안 됩니다. 제어할 수 있습니다 local.properties 파일에 저장되어야 합니다. 이 파일은 프로젝트의 루트 디렉터리에 있습니다. 자세한 내용은 local.properties 파일, 다음을 참고하세요. Gradle 속성 파일.

이 작업을 간소화하려면 Android용 Secrets Gradle 플러그인 다음 절차에 따라 Secrets Gradle 플러그인을 설치하고 안전하게 저장하세요. 확인할 수 있습니다

  1. 루트 수준 build.gradle 파일을 열고 다음 코드를 buildscript 아래 dependencies 요소.

    Groovy

    buildscript {
        dependencies {
            // ...
            classpath "com.google.android.libraries.mapsplatform.secrets-gradle-plugin:secrets-gradle-plugin:2.0.0"
        }
    }
    

    Kotlin

    buildscript {
        dependencies {
            // ...
            classpath("com.google.android.libraries.mapsplatform.secrets-gradle-plugin:secrets-gradle-plugin:2.0.0")
        }
    }
    
  2. 앱 수준 build.gradle 파일을 열고 다음 코드를 plugins 요소

    Groovy

    id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
    

    Kotlin

    id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin")
    
  3. Gradle과 프로젝트 동기화.

  4. 프로젝트 수준 디렉터리에서 local.properties를 열고 코드를 실행합니다. YOUR_API_KEY를 API 키로 바꾸어야 합니다.

    MAPS_API_KEY=YOUR_API_KEY
    
  5. AndroidManifest.xml 파일에서 com.google.android.geo.API_KEY로 이동합니다. 그리고 다음과 같이 android:value 속성을 업데이트합니다.

    <meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="${MAPS_API_KEY}" />
    

다음 예는 샘플 앱의 전체 매니페스트를 보여줍니다.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.driverapidemo" >
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/_AppTheme" >

        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="${MAPS_API_KEY}" />

        <activity android:name=".MainActivity" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

앱에 필수 저작자 표시 포함

앱에서 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'
}

이러한 종속 항목이 없으면 드라이버 SDK에서 런타임에 오류 발생 가상 머신으로 발생할 수 있습니다

ProGuard를 사용하여 빌드를 최적화하려면 ProGuard에 다음 줄을 추가해야 할 수 있습니다. 구성 파일:

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

지원되는 최소 API 수준은 23입니다.

SDK 초기화

제공업체 ID (일반적으로 Google Cloud 프로젝트 ID)는 DriverContext 객체를 초기화합니다. 태그 설정에 대한 자세한 내용은 자세한 내용은 인증 및 승인.

드라이버 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를 가져옵니다. DeliveryVehicleReporterNavigationVehicleReporter를 확장합니다.

    DeliveryVehicleReporter vehicleReporter = driverApi.getDeliveryVehicleReporter();
    

AuthTokenFactory로 인증

드라이버 SDK가 위치 업데이트를 생성하면 이 업데이트를 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에서 예외는 발생하지 않는 한 일시적인 예외로 간주됩니다. 합니다. 여러 번의 시도 후 Driver SDK는 오류가 영구적인 것으로 간주하고 업데이트 전송 시도를 중지합니다.

상태 및 Error Reporting(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 관련 참고사항

내부적으로 드라이버 SDK 구현은 Fleet Engine 서버와 안전하게 통신하기 위한 SSL/TLS 이전 버전 (API 버전 23 또는 이전)의 경우 SecurityProvider 패치가 필요할 수 있으며 있습니다. Android에서 SSL을 사용하는 방법에 대한 자세한 내용은 다음을 참조하세요. 보안 GMS 제공업체. 이 문서에는 보안 프로바이더에 패치를 적용하기 위한 코드 샘플도 포함되어 있습니다.

위치 업데이트 사용 설정

*VehicleReporter 인스턴스가 있으면 위치 업데이트를 사용 설정하는 방법은 다음과 같습니다. 명확성:

DeliveryVehicleReporter reporter = ...;

reporter.enableLocationTracking();

위치 업데이트는 가능한 경우 정기적으로 전송됩니다. 위치별 업데이트는 차량이 온라인 상태임을 나타냅니다.

기본적으로 보고 간격은 10초입니다. 보고서 설정을 변경하여 reporter.setLocationReportingInterval(long, TimeUnit) 사이의 간격입니다. 이 지원되는 최소 업데이트 간격은 5초입니다. 더 자주 업데이트하는 경우 더 느린 요청과 오류가 발생합니다.

위치 업데이트 사용 중지

운전석 근무가 끝나면 다음 번호로 전화를 걸어 위치 업데이트를 중지할 수 있습니다. DeliveryVehicleReporter.disableLocationTracking

신뢰할 수 있는 모델 사용 사례

이 섹션에서는 Driver SDK를 사용하여 일반적인 사용 사례를 구현하는 방법을 설명합니다. 신뢰할 수 있는 모델을 사용하는 경우

차량 만들기

Driver SDK에서 차량을 만들 수 있습니다.

차량을 만들기 전에 다음 사항을 확인하세요. Delivery Driver API 초기화 차량 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.
}

배송 수령 작업 만들기

Driver SDK에서 배송 수령 작업을 만들 수 있습니다.

할 일을 만들기 전에 Delivery Driver API 초기화 작업은 Driver 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.
}

배송 배송 작업 만들기

Driver 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 초기화 그런 다음 아래 예와 같이 unavailability 작업을 만듭니다. 작업 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은 VehicleStopStates(NEW, ENROUTE 또는 ARRIVED) 중 하나일 수 있습니다. 현재 정류장 이후의 VehicleStop은 새 VehicleStopState에 있어야 합니다.

  • 작업이 존재하지 않거나 다른 차량에 속합니다.

  • 차량이 존재하지 않습니다.

차량이 다음 정류장으로 이동 중입니다

차량이 정류장에서 출발할 때와 정차할 때 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를 다시 전송합니다.

발생할 수 있는 문제는 다음과 같습니다.

  • 드라이버 SDK에 설정된 남은 VehicleStops가 없습니다.

차량이 정류장에 도착함

차량이 정류장에 도착하면 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.
}

드라이버 SDK의 내부 시스템 업데이트가 차단되는 예외가 발생할 수 있습니다. state. 이 경우 문제를 해결한 후 arrivedAtStop를 다시 호출하세요. 성공할 때까지 기다립니다

발생할 수 있는 문제는 다음과 같습니다.

  • 드라이버 SDK에 설정된 남은 VehicleStops가 없습니다.

차량이 멈춤 완료

차량이 정차를 완료하면 Fleet Engine에 알려야 합니다. 이 알림 중지와 관련된 모든 작업이 CLOSED 상태로 설정됩니다. 다음과 같은 작업을 할 수 있습니다. Driver SDK에서 Fleet Engine에 알립니다.

다음에 표시된 것처럼 차량이 VehicleStop을 완료했음을 Fleet Engine에 알립니다. 다음 예시를 참고하세요.

    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에 알리거나 차량이 작업이 이루어지는 정류장을 완료한 경우 차량 정류장 목록에서 삭제합니다. 이렇게 하려면 나머지 차량이 정차할 때처럼 차량의 작업 순서를 업데이트합니다.

작업에 아직 차량에 할당되지 않았고 작업을 종료해야 하는 경우 작업을 CLOSED 상태로 변경합니다. 그러나 CLOSED 작업은 다시 열 수 없습니다.

작업 종료는 성공 또는 실패를 나타내지 않습니다. 이것은 태스크가 더 이상 진행 중인 것으로 간주되지 않습니다. 배송 추적의 경우 중요한 점은 태스크의 실제 결과를 나타내서 배포 결과를 표시할 수 있습니다.

Driver SDK를 사용하려면 차량에 작업을 할당해야 합니다. 작업을 닫습니다. 차량에 할당된 작업을 종료하려면 차량이 작업이 이루어지는 정차를 완료한 차량 엔진입니다.

또는 차량의 작업 순서를 업데이트합니다. 목록에서 할 일을 목록에서 삭제하고 있습니다

작업 결과 및 결과 위치 설정

작업을 닫는다고 해서 성공 또는 실패를 의미하지는 않습니다. 이것은 태스크가 더 이상 진행 중인 것으로 간주되지 않습니다. 배송 추적의 경우 배송 조회 시 작업의 실제 결과를 나타내서 배포 결과를 표시할 수 있습니다. 서비스에 대한 적절한 결제가 있는지 확인해야 합니다 한 번 설정하면 태스크 결과입니다. 그러나 작업 결과 시간과 작업 결과 위치를 수정할 수 있습니다. 변경할 수 있습니다.

CLOSED 상태인 태스크의 결과는 다음 중 하나로 설정될 수 있습니다. SUCCEEDED(성공) 또는 FAILED(실패)입니다. 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에서 차량을 조회할 수 있습니다. 차량을 찾기 전에 반드시 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.
    }

DeliveryVehicleManagerDeliveryVehicle만 조회할 수 있습니다. Delivery Driver API 초기화 중에 제공된 차량 ID