Primeiros passos com o SDK do driver para Android

Requisitos mínimos do sistema

O dispositivo móvel precisa ter o Android 6.0 (nível 23 da API) ou mais recente.

Configuração do build e das dependências

As versões 4.99 e mais recentes do SDK do driver estão disponíveis no repositório Maven do Google.

Gradle

Adicione a instrução a seguir ao seu arquivo build.gradle:

repositories {
    ...
    google()
}

Maven

Adicione a instrução a seguir ao seu arquivo pom.xml:

<project>
  ...
  <repositories>
    <repository>
      <id>google-maven-repository</id>
      <url>https://maven.google.com</url>
    </repository>
  </repositories>
  ...
</project>

Configuração do projeto

Para usar o SDK do Driver, seu app precisa ser direcionado minSdkVersion 23 ou mais recente. Para mais informações, consulte Notas de lançamento.

Para executar um app criado com o SDK do Driver, o Android dispositivo deve ter Google Play Services instalado.

Configurar seu projeto de desenvolvimento

Como configurar seu projeto de desenvolvimento e gerar uma chave de API para o projeto no console do Google Cloud:

  1. Crie um novo console do Google Cloud. projeto ou selecione um existente, para uso com o SDK do Driver. Aguarde alguns minutos até o novo projeto fica visível no console do Google Cloud.

  2. Para executar o app de demonstração, seu projeto precisa ter acesso ao SDK do Maps. para Android. No console do Google Cloud, selecione APIs e Serviços > Library, pesquise e ative o SDK do Maps para Android

  3. Receba uma chave de API para o projeto selecionando APIs e Serviços > Credenciais > Criar credenciais > Chave de API. Para mais informações sobre como acessar uma chave de API, consulte Gere uma chave de API.

Adicionar o SDK do Driver ao app

O SDK do Driver está disponível no repositório Maven do Google. A inclui os arquivos .pom (Project Object Model) do SDK e Javadocs. Para adicionar o SDK do Driver ao app:

  1. Adicione a seguinte dependência à sua configuração do Gradle ou Maven. substituindo o marcador VERSION_NUMBER pela versão escolhida do SDK do Driver.

    Gradle

    Adicione o seguinte ao seu build.gradle:

    dependencies {
      ...
      implementation 'com.google.android.libraries.mapsplatform.transportation:transportation-driver:VERSION_NUMBER'
    }
    

    Maven

    Adicione o seguinte ao seu pom.xml:

    <dependencies>
      ...
      <dependency>
        <groupId>com.google.android.libraries.mapsplatform.transportation</groupId>
        <artifactId>transportation-driver</artifactId>
        <version>VERSION_NUMBER</version>
      </dependency>
    </dependencies>
    
  2. O SDK do Driver depende do SDK do Navigation. Essa dependência é configurada de uma de modo que, se uma versão específica do SDK do Navigation for necessária, ela será explicitamente definido no arquivo de configuração do build, da seguinte maneira: a omissão do bloco de código mencionado permitirá que o projeto sempre faça o download a versão mais recente do SDK do Navigation na versão de lançamento principal; Observe que os comportamentos combinados das versões mais recentes do SDK do Driver e O SDK do Navigation foi submetido a testes rigorosos antes do lançamento.

    Organizar a configuração de dependências dos aplicativos de desenvolvimento e versão de acordo com os ambientes.

    Gradle

    Adicione o seguinte ao seu build.gradle:

    dependencies {
      ...
      implementation 'com.google.android.libraries.navigation:navigation:5.0.0'
    }
    

    Maven

    Adicione o seguinte ao seu pom.xml:

    <dependencies>
      ...
      <dependency>
        <groupId>com.google.android.libraries.navigation</groupId>
        <artifactId>navigation</artifactId>
        <version>5.0.0</version>
      </dependency>
    </dependencies>
    

Atualizar o manifesto do app

Depois de adicionar o SDK do Driver ao app, será possível atualize o manifesto do app editando o arquivo AndroidManifest.xml.

Adicione sua chave de API ao elemento <application>. Você deve usar o chave de API do projeto que você recebeu quando configure seu projeto de desenvolvimento.

Por exemplo, substitua PASTE_YOUR_API_KEY_HERE pela sua chave de API. nos seguintes metadados do aplicativo:

<meta-data
    android:name="com.google.android.geo.API_KEY"
    android:value="PASTE_YOUR_API_KEY_HERE"/>

O exemplo a seguir mostra um manifesto completo para um app de exemplo:

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

Incluir as atribuições necessárias no app

Se você usa o SDK do Driver no app, é necessário incluir texto de atribuição e licenças de código aberto como parte dos avisos legais do seu app nesta seção. É melhor incluir as atribuições como um item de menu independente ou como no item de menu Sobre.

As informações sobre as licenças podem ser encontradas em "third_party_licenses.txt" arquivo no o arquivo AAR desarquivado.

Consulte https://developers.google.com/android/guides/opensource sobre como incluir avisos de código aberto.

Dependências

O SDK do Driver usa gRPC para se comunicar com o servidor do Fleet Engine. Se você ainda não tiver o gRPC, talvez seja necessário declarar as seguintes dependências:

dependencies {
    implementation 'io.grpc:grpc-android:1.12.0'
    implementation 'io.grpc:grpc-okhttp:1.12.0'
}

Sem essas dependências, o SDK do Driver encontrar erros durante a execução ao tentar se comunicar com o servidor do Fleet Engine.

Se você usa o ProGuard para otimizar suas compilações, pode ser necessário adicionar as seguintes linhas ao seu ProGuard de configuração do Terraform:

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

O nível mínimo de API com suporte é 23.

Inicializar o SDK

Um ID de provedor (geralmente o ID do projeto do Google Cloud) é necessário para o objeto FleetEngine. Para mais detalhes sobre como configurar a do Google Cloud, consulte Autenticação e autorização.

Antes de usar o SDK do Driver, primeiro é necessário inicializar SDK do Navigation. Para iniciar o SDK:

  1. Consiga um objeto Navigator do 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;
            }
          }
    );
    
  2. Crie um objeto DriverContext, preenchendo os campos obrigatórios.

    DriverContext driverContext = DriverContext.builder(application)
                 .setProviderId(providerId)
                 .setVehicleId(vehicleId)
                 .setAuthTokenFactory(authTokenFactory)
                 .setNavigator(navigator)
                 .setRoadSnappedLocationProvider(
                     NavigationApi.getRoadSnappedLocationProvider(application))
                 .build()
    
  3. Use o objeto DriverContext para inicializar o *DriverApi.

    DeliveryDriverApi driverApi = DeliveryDriverApi.createInstance(driverContext);
    
  4. Consiga o DeliveryVehicleReporter do objeto da API. (DeliveryVehicleReporter estende NavigationVehicleReporter.)

    DeliveryVehicleReporter vehicleReporter = driverApi.getDeliveryVehicleReporter();
    

Autenticar com AuthTokenFactory

Quando o SDK do Driver gera atualizações de localização, ele precisa enviar essas atualizações para no servidor do Google Fleet Engine. Para autenticar essas solicitações, o O SDK do Driver faz chamadas para o autor da chamada instância de AuthTokenFactory. A fábrica é responsável por gerar tokens de autenticação no local e a hora da atualização.

A maneira exata como os tokens são gerados é específica para cada situação de desenvolvedor. No entanto, a implementação provavelmente precisará:

  • Busque um token de autenticação, possivelmente no formato JSON, em um servidor HTTPS.
  • Analisar e armazenar em cache o token.
  • Atualizar o token quando ele expirar.

Para detalhes sobre os tokens esperados pelo servidor do Fleet Engine, consulte Crie um JSON Web Token (JWT) para autorização.

Este é o esqueleto de uma implementação de 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);
    }
  }
}

Essa implementação específica usa o cliente HTTP Java integrado para buscar uma token em formato JSON do servidor de autenticação do desenvolvedor. O token é salvas para reutilização. O token será buscado novamente se o token antigo estiver dentro de 10 minutos. do tempo de validade.

Sua implementação pode fazer coisas de forma diferente, como usar uma linha de execução em segundo plano para atualizar tokens.

Exceções em AuthTokenFactory são tratadas como temporárias, a menos que aconteçam repetidamente. Depois de algumas tentativas, o SDK do Driver presume que o erro é permanente e para de tentar enviar atualizações.

Status e relatórios de erros com StatusListener

Como o SDK do Driver realiza ações segundo plano, use StatusListener para acionar notificações quando determinados como erros, avisos ou mensagens de depuração. Os erros podem ser temporária por natureza (como BACKEND_CONNECTIVITY_ERROR), ou podem fazer com que as atualizações de localização sejam interrompidas permanentemente (como VEHICLE_NOT_FOUND, indicando um erro de configuração).

Você fornece uma implementação de StatusListener opcional, como esta:

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

Observações sobre SSL/TLS

Internamente, a implementação do SDK do Driver usa SSL/TLS para comunicação segura com o servidor do Fleet Engine. Versões anteriores do Android (versões da API) 23 ou anterior) pode exigir uma SecurityProvider para se comunicar com o servidor. Para mais informações sobre como trabalhar com SSL no Android, consulte Atualize seu provedor de segurança para se proteger contra explorações de SSL. O artigo também contém exemplos de código para aplicar patches ao provedor de segurança.

Ativar atualizações de localização

Quando você tiver uma instância do *VehicleReporter, será necessário ativar as atualizações de localização. direta:

DeliveryVehicleReporter reporter = ...;

reporter.enableLocationTracking();

As atualizações de localização são enviadas em intervalos regulares, se possível. Cada local update também indica que o veículo está on-line.

Por padrão, o intervalo é de 10 segundos, mas é possível alterar de relatório com FleetEngine.setLocationReportingInterval(long, TimeUnit): O mínimo de atualização com suporte é de 5 segundos. Atualizações mais frequentes podem resultar em solicitações e erros mais lentos.

Desativar atualizações de localização

Quando o turno do motorista terminar, as atualizações de localização poderão ser interrompidas chamando DeliveryVehicleReporter.disableLocationTracking:

Casos de uso de modelos confiáveis

Esta seção descreve como usar o SDK do Driver para implementar casos de uso comuns ao usar o modelo confiável.

Criar um veículo

Você pode criar um veículo usando o SDK do Driver.

Antes de criar um veículo, inicialize a API Delivery Driver. O ID do veículo precisa ser criado com os IDs do veículo e do provedor usados durante a inicialização do SDK do Driver. Depois, crie o veículo conforme mostrado no exemplo a seguir:

DeliveryDriverApi api = DeliveryDriverApi.getInstance();
DeliveryVehicleManager vehicleManager = api.getDeliveryVehicleManager();
try {
  DeliveryVehicle vehicle = vehicleManager.createVehicle().get();
  // Handle CreateVehicleRequest DeliveryVehicle response.
} catch (Exception e) {
  // Handle CreateVehicleRequest error.
}

Criar uma tarefa de retirada de frete

Você pode criar uma tarefa de retirada de remessas no SDK do Driver.

Antes de criar uma tarefa, inicialize a API Delivery Driver. A tarefa precisa ser criada com o ID do provedor especificado no SDK do Driver. inicialização do sistema. Em seguida, crie a tarefa de retirada do frete conforme mostrado exemplo. Para informações sobre IDs de tarefas, consulte Exemplos de IDs de tarefas.

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

Criar uma tarefa de entrega de remessa

É possível criar uma tarefa de entrega de remessa no SDK do Driver.

Antes de criar uma tarefa, inicialize a API Delivery Driver. Em seguida, crie a tarefa de entrega da remessa, conforme mostrado no exemplo a seguir. Para informações sobre IDs de tarefas, consulte Exemplos de IDs de tarefas.

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

Indisponibilidade programada

É possível criar uma tarefa indicando indisponibilidade (por exemplo, para motoristas quebras ou reabastecimento de veículos) do SDK do Driver. Uma indisponibilidade programada tarefa não deve incluir um ID de acompanhamento. Também é possível informar um local.

Antes de criar uma tarefa, inicialize a API Delivery Driver. Em seguida, crie a tarefa de indisponibilidade, conforme mostrado no exemplo a seguir. Para informações sobre IDs de tarefas, consulte Exemplos de IDs de tarefas.

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

Paradas programadas

Você pode criar uma tarefa de parada programada no SDK do Driver. Um evento Parar tarefa não pode incluir um ID de acompanhamento.

Antes de criar uma tarefa, inicialize a API Delivery Driver. Em seguida, crie a tarefa de parada programada, conforme mostrado no exemplo a seguir. Para informações sobre IDs de tarefas, consulte Exemplos de IDs de tarefas.

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

Atualizar a ordem das tarefas

Você pode atualizar a ordem de execução das tarefas atribuídas a um veículo no SDK do Driver.

Atualizar a ordem das tarefas também atribui tarefas a um veículo, caso elas não estejam foram atribuídos anteriormente a um veículo. Ela também encerra tarefas atribuídas a um veículo e foram deixadas de fora da ordem atualizada. A atribuição de um tarefa a um veículo diferente se tivesse sido anteriormente atribuída a outro veículo gera um erro. Antes de atribuir uma tarefa ao novo veículo, feche a tarefa existente e, em seguida, criar uma nova tarefa.

Você pode atualizar a ordem das tarefas a qualquer momento.

Antes de atualizar a ordem de tarefas para um veículo, certifique-se de que o veículo e tarefas já foram criadas no Fleet Engine. Em seguida, atualize a ordem das tarefas para o veículo, como mostrado no exemplo a seguir.

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

Pode ocorrer uma exceção que pode impedir uma atualização ao estado interno do SDK do Driver. Se isso acontecer, resolva o problema e Chame setVehicleStops novamente até que a chamada seja concluída.

Os possíveis problemas podem incluir:

  • Os VehicleStops especificados não seguem um padrão válido. Somente o primeiro VehicleStop pode estar em qualquer um dos VehicleStopStates: NEW, ENROUTE ou ARRIVED. As paradas de veículos depois da parada atual precisam estar no estado NEW VehicleStopState.

  • As tarefas não existem ou pertencem a um veículo diferente.

  • O veículo não existe.

O veículo está a caminho da próxima parada

O Fleet Engine precisa ser notificado quando um veículo sai de uma parada e quando inicia a navegação. Você pode notificar o Fleet Engine pelo SDK do driver.

Antes de notificar o Fleet Engine sobre a saída de um veículo de uma parada, verifique se as paradas dos veículos foram criadas e definidas. Em seguida, notifique a Fleet Engine a partida do veículo, como mostra o exemplo a seguir.

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

Pode ocorrer uma exceção que impede a atualização do SDK do driver estado interno. Se isso acontecer, resolva o problema e ligue para enrouteToNextStop novamente até que a operação seja concluída.

Os possíveis problemas podem incluir:

  • Nenhum VehicleStops restante definido no SDK do Driver.

O veículo chega a uma parada

O Fleet Engine precisa ser notificado quando um veículo chega a uma parada. Você pode notificar o Fleet Engine do SDK do driver.

Antes de notificar o Fleet Engine de que um veículo chegou a uma parada, verifique se as paradas dos veículos foram definidas. Em seguida, notificar o Fleet Engine sobre a chegada do veículo na parada, como mostrado no exemplo a seguir.

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

Pode ocorrer uma exceção que impede uma atualização do SDK interno do SDK state. Se isso acontecer, resolva o problema e chame arrivedAtStop novamente. até que dê certo.

Os possíveis problemas podem incluir:

  • Nenhum VehicleStops restante definido no SDK do Driver.

O veículo conclui uma parada

O Fleet Engine precisa ser notificado quando um veículo conclui uma parada. Isso faz com que todos tarefas associadas à parada sejam definidas para um estado CLOSED. Você pode notificar a frota Engine pelo SDK do Driver.

Notificar o Fleet Engine de que o veículo concluiu o VehicleStop, conforme mostrado em no exemplo a seguir.

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

Pode ocorrer uma exceção que impede uma atualização do SDK interno do SDK state. Se isso acontecer, resolva o problema e chame completedStop novamente. até que dê certo.

Os possíveis problemas podem incluir:

  • Nenhum VehicleStops restante definido no SDK do Driver.

Fechar uma tarefa

Para encerrar uma tarefa atribuída a um veículo, notifique o Fleet Engine que o veículo concluiu a parada onde a tarefa ocorre, ou removê-lo da lista de paradas de veículos. Para fazer isso, você pode definir a lista de o veículo restante para, assim como quando atualizar a ordem de tarefas de um veículo.

Se uma tarefa ainda não tiver sido atribuída a um veículo e precisar ser fechada, atualize o para o estado CLOSED. No entanto, não é possível reabrir uma tarefa CLOSED.

Encerrar uma tarefa não indica sucesso ou falha. Ela indica que a tarefa não é mais considerado em andamento. Para o rastreamento de remessas, é importante indicar o resultado real de uma tarefa para que um resultado de entrega possa ser mostrado.

Uma tarefa precisa ser atribuída a um veículo para usar o SDK do motorista. para fechar a tarefa. Para fechar uma tarefa atribuída a um veículo, notifique Fleet Engine que o veículo concluiu a parada em que a tarefa ocorre.

Como alternativa, atualize a ordem de tarefas do veículo atribuída à tarefa e depois remove a tarefa desejada da lista de paradas.

Definir o resultado da tarefa e o local dos resultados

Fechar uma tarefa não indica sucesso ou falha. Ela indica que a tarefa não é mais considerado em andamento. Para o rastreamento de remessas, é importante indicar o resultado real de uma tarefa para que um resultado de entrega possa ser mostrado e, portanto, para que haja cobrança adequada para os serviços. Depois de definido, não é possível alterar o resultado da tarefa. Mas é possível modificar o horário e o local do resultado da tarefa depois de configurá-las.

Tarefas que estão no estado FECHADO podem ter seus resultados definidos como CONCLUÍDA ou COM FALHA. O Fleet Engine cobra apenas as tarefas de entrega com estado de CONCLUÍDA.

Ao marcar o resultado de uma tarefa, o Fleet Engine a preenche automaticamente com a última localização conhecida do veículo. É possível substituir essa ao chamar o Fleet Engine. Não é possível definir o local dos resultados das tarefas usando o SDK do Driver.

O exemplo de código a seguir demonstra como usar o SDK do Driver para definir uma tarefa o resultado e o carimbo de data/hora.

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

Procurar um veículo

Você pode procurar um veículo no SDK do Driver. Antes de procurar um veículo, garanta que você inicialize a API Delivery Driver. Em seguida, pesquise o veículo conforme mostrado no exemplo a seguir.

DeliveryDriverApi api = DeliveryDriverApi.getInstance();
DeliveryVehicleManager vehicleManager = api.getDeliveryVehicleManager();
try {
   DeliveryVehicle vehicle = vehicleManager.getVehicle().get();
   // Handle GetVehicleRequest DeliveryVehicle response.
} catch (Exception e)  {
   // Handle GetVehicleRequest error.
}

O DeliveryVehicleManager só pode pesquisar o DeliveryVehicle. para o ID do veículo informado durante a inicialização da API Delivery Driver.