Android용 드라이버 SDK 시작하기

최소 시스템 요구사항

휴대기기에서는 Android 6.0(API 수준 23) 이상을 실행해야 합니다.

빌드 및 종속 항목 구성

드라이버 SDK 버전 4.99 이상은 Google Maven 저장소에서 사용할 수 있습니다.

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>

프로젝트 구성

Driver SDK를 사용하려면 앱에서 minSdkVersion 23 이상을 타겟팅해야 합니다. 자세한 내용은 출시 노트를 참고하세요.

드라이버 SDK로 빌드된 앱을 실행하려면 Android 기기에 Google Play 서비스가 설치되어 있어야 합니다.

개발 프로젝트 설정하기

Google Cloud 콘솔에서 개발 프로젝트를 설정하고 프로젝트의 API 키를 가져오는 방법은 다음과 같습니다.

  1. Driver SDK와 함께 사용할 새 Google Cloud 콘솔 프로젝트를 만들거나 기존 프로젝트를 선택합니다. 새 프로젝트가 Google Cloud 콘솔에 표시될 때까지 몇 분 정도 기다립니다.

  2. 데모 앱을 실행하려면 프로젝트에 Android용 Maps SDK 액세스 권한이 있어야 합니다. Google Cloud 콘솔에서 API 및 서비스 > 라이브러리를 선택한 다음 Android용 Maps SDK를 검색하여 사용 설정합니다.

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

앱에 드라이버 SDK 추가

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

  1. Gradle 또는 Maven 구성에 다음 종속 항목을 추가하여 선택한 버전의 Driver SDK 대신 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의 최신 버전을 다운로드할 수 있습니다. 최신 버전의 Driver 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 키 추가하기

드라이버 SDK를 앱에 추가한 후 앱에 API 키를 추가합니다. 개발 프로젝트를 설정할 때 가져온 프로젝트 API 키를 사용해야 합니다.

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

이 작업을 간소화하려면 Android용 Secrets Gradle 플러그인을 사용하세요. 다음 절차에 따라 Secrets Gradle 플러그인을 설치하고 API 키를 안전하게 저장합니다.

  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를 사용하는 경우 앱의 법적 고지 섹션에 저작자 표시 텍스트와 오픈소스 라이선스를 포함해야 합니다. 저작자 표시는 독립적인 메뉴 항목 또는 정보 메뉴 항목의 일부로 포함하는 것이 가장 좋습니다.

라이선스 정보는 보관 취소된 AAR 파일의 'third_party_licenses.txt' 파일에서 확인할 수 있습니다.

오픈소스 알림을 포함하는 방법은 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 초기화

DriverContext 객체를 초기화하려면 제공업체 ID (일반적으로 Google Cloud 프로젝트 ID)가 필요합니다. Google Cloud 프로젝트 설정에 대한 자세한 내용은 인증 및 승인을 참조하세요.

Driver 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로 인증

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

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

이 구현에서는 기본 제공 자바 HTTP 클라이언트를 사용하여 개발자의 인증 서버에서 JSON 형식의 토큰을 가져옵니다. 토큰은 재사용을 위해 저장됩니다. 이전 토큰의 만료 시간이 10분 이내이면 토큰을 다시 가져옵니다.

구현에서는 백그라운드 스레드를 사용하여 토큰을 갱신하는 등 다른 작업을 실행할 수도 있습니다.

AuthTokenFactory의 예외는 반복적으로 발생하지 않는 한 일시적인 것으로 간주됩니다. 여러 번 시도한 후 드라이버 SDK는 오류가 영구적인 것으로 가정하고 업데이트 전송 시도를 중지합니다.

StatusListener를 사용한 상태 및 Error Reporting

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 구현은 SSL/TLS를 사용하여 Fleet Engine 서버와 안전하게 통신합니다. Android의 이전 버전 (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는 Driver SDK 초기화 중에 사용되는 차량 및 제공업체 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.
}

배송 수령 작업 만들기

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

배송 태스크 만들기

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

예약된 사용 중지

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

예정된 경유지

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

할 일 순서 업데이트

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

드라이버 SDK의 내부 상태 업데이트를 막는 예외가 발생할 수 있습니다. 이 경우 문제를 해결한 다음 호출이 성공할 때까지 setVehicleStops를 다시 호출하세요.

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

  • 지정된 VehicleStops가 유효한 패턴을 따르지 않습니다. 첫 번째 VehicleStop만 VehicleStopState(NEW, ENROUTE 또는 ARRIVED)에 포함될 수 있습니다. 현재 정류장 이후의 VehicleStop은 NEW VehicleStopState에 있어야 합니다.

  • 태스크가 존재하지 않거나 다른 차량에 속합니다.

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

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

Fleet Engine은 차량이 정류장에서 출발하거나 내비게이션을 시작할 때 알림을 받아야 합니다. Driver 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에 알려야 합니다. Driver 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에 알려야 합니다. 이 알림을 통해 정류장과 관련된 모든 작업이 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의 내부 상태 업데이트를 차단할 수 있는 예외가 발생할 수 있습니다. 이 경우 문제를 해결한 다음 성공할 때까지 completedStop를 다시 호출합니다.

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

  • 드라이버 SDK에 설정된 나머지 VehicleStops가 없습니다.

할 일 닫기

차량에 할당된 태스크를 닫으려면 Fleet Engine에 태스크가 발생하는 위치에서 차량이 정차를 완료했음을 알리거나 차량 정류장 목록에서 삭제하세요. 이렇게 하려면 차량의 작업 순서를 업데이트할 때와 마찬가지로 나머지 차량 정류장 목록을 설정하면 됩니다.

작업에 아직 차량이 할당되지 않았고 작업을 닫아야 한다면 작업을 CLOSED 상태로 업데이트합니다. 하지만 닫은 작업은 다시 열 수 없습니다.

작업을 닫는 것은 성공 또는 실패를 나타내지 않습니다. 이는 작업이 더 이상 진행 중인 것으로 간주되지 않음을 나타냅니다. 배송 추적의 경우 배송 결과를 표시할 수 있도록 작업의 실제 결과를 표시하는 것이 중요합니다.

Driver SDK를 사용하여 작업을 닫으려면 차량에 작업을 할당해야 합니다. 차량에 할당된 작업을 종료하려면 차량이 작업이 이루어지는 정류장을 완료했음을 Fleet Engine에 알립니다.

또는 작업이 할당된 차량의 작업 순서를 업데이트하고 정류장 목록에서 작업을 삭제합니다.

작업 결과 및 결과 위치 설정

태스크 종료는 성공 또는 실패를 나타내지 않습니다. 이는 작업이 더 이상 진행 중인 것으로 간주되지 않음을 나타냅니다. 배송 추적 시 작업의 실제 결과를 표시하여 배송 결과를 표시하고 적절한 서비스 비용이 청구되도록 하는 것이 중요합니다. 설정한 후에는 태스크 결과를 변경할 수 없습니다. 하지만 작업 결과 시간과 작업 결과 위치를 설정한 후에는 수정할 수 있습니다.

CLOSED 상태에 있는 작업은 결과를 성공 또는 실패로 설정할 수 있습니다. 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.
    }

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