Driver SDK for Android のスタートガイド

Driver SDK を使用すると、ナビゲーションとトラッキングを強化できる 旅行と注文の進行状況アプリに 直接追加できますDriver SDK は、 On-demand Rides and Deliveries Solution Fleet Engine に車両の位置とタスクを更新する。

Driver SDK は、Fleet Engine サービスとカスタム サービスを 車両の位置と状態を把握できますたとえば、車両は ONLINE です。 または OFFLINE に設定され、ルートの進行に伴って車両の位置情報が変化する場合。

最小システム要件

モバイル デバイスに Android 6.0 が搭載されている必要があります。 (API レベル 23)以降が必要です。

ビルドと依存関係の構成

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

Project Configuration

Driver SDK を使用するには、アプリで以下をターゲットに設定する必要があります。 minSdkVersion 23 以降。

Driver SDK でビルドしたアプリを実行するには、 デバイスが Google Play 開発者サービス インストールされています。

開発プロジェクトを設定する

開発プロジェクトをセットアップして API キーを取得する方法 Google Cloud コンソールでプロジェクトに対して次の操作を行います。

  1. 使用する新しい Google Cloud コンソール プロジェクトを作成するか、既存のプロジェクトを選択します。 Driver SDK を使用します通知が届くまで数分 新しいプロジェクトが Google Cloud コンソールに表示されます。

  2. デモアプリを実行するには、プロジェクトが Maps SDK にアクセスできる必要があります。 説明します。Google Cloud コンソールで、[ API とサービス >Library に移動し、Maps SDK for Android。

  3. [API キーを取得] を選択して、プロジェクトの API キーを取得します。 API とサービス >クルデンシャル >認証情報を作成 >API キー。 API キーの取得について詳しくは、以下をご覧ください。 API キーを取得します

Driver SDK をアプリに追加する

Driver SDK は Google Maven リポジトリから入手できます。「 リポジトリには、SDK のプロジェクト オブジェクト モデル(.pom)ファイルと Javadocs が含まれています。Driver 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</groupId>
        <artifactId>transportation-driver</artifactId>
        <version>VERSION_NUMBER</version>
      </dependency>
    </dependencies>
    
  2. Driver 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 キーを追加する

Driver SDK をアプリに追加したら、API キーをアプリに追加します。マイページ プロジェクト API キーを使用する必要があります。 開発プロジェクトを設定します。

このセクションでは、API キーを安全に保管する方法について説明します。 自動的に参照されます。API キーをバージョンにチェックインしないでください 制御システムです。これは local.properties ファイルに保存する必要があります。 このファイルは、プロジェクトのルート ディレクトリにあります。詳細については、 local.properties ファイルについては、以下をご覧ください。 Gradle プロパティ ファイル

このタスクを効率化するには、Android 用 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. Android Studio を使用している場合は、 プロジェクトを 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 を使用する場合は、以下を含める必要があります。 (アプリの法的通知の一部として含めることができる、帰属表示テキストおよびオープンソース ライセンス) できます。帰属情報は、独立したメニュー項目として、または [About] メニュー項目の一部。

ライセンス情報は「third_party_licenses.txt」にあります。ファイル - アーカイブ解除された AAR ファイル

https://developers.google.com/android/guides/opensource をご覧ください。 記載する方法をご覧ください。

依存関係

ProGuard を使用して行う場合 ビルドを最適化するには、ProGuard に次の行を追加する必要があります。 使用します。

-dontwarn com.google.**
-dontwarn okio.**

サポートされる最小 API レベルは 23 です。

SDK の初期化

プロバイダ ID(通常は Google Cloud プロジェクト ID)が必要です。 DriverContext オブジェクトを初期化します。「新規顧客の獲得」目標の設定について詳しくは、 詳細については、以下をご覧ください。 認証と認可

Driver SDK を使用する前に、まずドライバの 説明しますSDK を初期化するには:

  1. NavigationApi から Navigator オブジェクトを取得します。

    Java

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

    Kotlin

    NavigationApi.getNavigator(
      this, // Activity
      object : NavigatorListener() {
        override fun onNavigatorReady(navigator: Navigator) {
          // Keep a reference to the Navigator (used to configure and start nav)
          this@myActivity.navigator = navigator
        }
      },
    )
    
  2. DriverContext オブジェクトを作成し、必須フィールドに値を入力します。

    Java

    DriverContext driverContext = DriverContext.builder(application)
        .setProviderId(providerId)
        .setVehicleId(vehicleId)
        .setAuthTokenFactory(authTokenFactory)
        .setNavigator(navigator)
        .setRoadSnappedLocationProvider(
            NavigationApi.getRoadSnappedLocationProvider(application))
        .build();
    

    Kotlin

    val driverContext =
      DriverContext.builder(application)
        .setProviderId(providerId)
        .setVehicleId(vehicleId)
        .setAuthTokenFactory(authTokenFactory)
        .setNavigator(navigator)
        .setRoadSnappedLocationProvider(NavigationApi.getRoadSnappedLocationProvider(application))
        .build()
    
  3. DriverContext オブジェクトを使用して *DriverApi を初期化します。

    Java

    RidesharingDriverApi ridesharingDriverApi = RidesharingDriverApi.createInstance(driverContext);
    

    Kotlin

    val ridesharingDriverApi = RidesharingDriverApi.createInstance(driverContext)
    
  4. API オブジェクトから RidesharingVehicleReporter を取得します。 (*VehicleReporterNavigationVehicleReporter を拡張します)。

    Java

    RidesharingVehicleReporter vehicleReporter = ridesharingDriverApi.getRidesharingVehicleReporter();
    

    Kotlin

    val vehicleReporter = ridesharingDriverApi.getRidesharingVehicleReporter()
    

AuthTokenFactory による認証

Driver SDK が位置情報の更新データを生成すると、 これらのアップデートを Fleet Engine サーバーと通信しますこれらのリクエストを認証するために、 Driver SDK は呼び出し元が提供する AuthTokenFactory のインスタンス。 ファクトリがロケーションで認証トークンを生成する 指定することもできます。

トークンが正確に生成される方法は、開発者ごとに異なります。 ただし、実装にはおそらく以下が必要になります。

  • HTTPS サーバーから認証トークン(JSON 形式など)を取得する
  • トークンを解析してキャッシュに保存する
  • トークンが期限切れになったら更新

Fleet Engine サーバーによって予期されるトークンの詳細については、以下をご覧ください。 認可用の JSON Web Token(JWT)を作成する

AuthTokenFactory のスケルトン実装は次のとおりです。

Java

class JsonAuthTokenFactory implements AuthTokenFactory {
  private String token;  // 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(authTokenContext.getVehicleId());
    }
    return token;
  }

  private void fetchNewToken(String vehicleId) {
    String url =
        new Uri.Builder()
            .scheme("https")
            .authority("yourauthserver.example")
            .appendPath("token")
            .appendQueryParameter("vehicleId", vehicleId)
            .build()
            .toString();

    try (Reader r = new InputStreamReader(new URL(url).openStream())) {
      com.google.gson.JsonObject obj
          = com.google.gson.JsonParser.parseReader(r).getAsJsonObject();
      token = obj.get("Token").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);
    }
  }
}

Kotlin

class JsonAuthTokenFactory : AuthTokenFactory() {

  private var token: String = ""
  private var expiryTimeMs: Long = 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 fun getToken(context: AuthTokenContext): String {
    if (System.currentTimeMillis() > expiryTimeMs) {
      // The token has expired, go get a new one.
      fetchNewToken(authTokenContext.getVehicleId())
    }
     return token
  }

  fun fetchNewToken(vehicleId: String) {
    val url =
      Uri.Builder()
        .scheme("https")
        .authority("yourauthserver.example")
        .appendPath("token")
        .appendQueryParameter("vehicleId", vehicleId)
        .build()
        .toString()

    try {
      val reader = InputStreamReader(URL(url).openStream())

      reader.use {
        val obj = com.google.gson.JsonParser.parseReader(r).getAsJsonObject()

        token = obj.get("ServiceToken").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 (e: IOException) {
      // 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 RuntimeException("Could not get auth token", e)
    }
  }
}

この実装では、組み込みの Java HTTP クライアントを使用して、 JSON 形式のトークンをデベロッパーの認証サーバーから受け取ります。トークンは、 再利用できます。古いトークンが 10 分以内に再取得される 表示されます。

実装によって、バックグラウンド スレッドの使用など、異なる処理が行われる場合があります。 トークンを更新します。

AuthTokenFactory での例外は、発生しない限り一時的なものとして扱われます 繰り返します。何度か試行した後、Driver SDK が 想定しており、 エラーは解消されず、アップデートの送信が停止されます。

StatusListener を使用した Status と Error Reporting

Driver SDK は実行時にアクションを実行するため、 特定の状況で通知をトリガーするには、StatusListener を使用します。 発生したイベント(エラー、警告、デバッグ メッセージなど)です。エラーの可能性: 一時的なもの(BACKEND_CONNECTIVITY_ERROR など)であるか、 位置情報の更新が永久に停止する(VEHICLE_NOT_FOUND、 (構成エラーを示します)。

次のように、オプションの StatusListener 実装を指定します。

Java

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

Kotlin

class MyStatusListener : StatusListener() {
  /** Called when background status is updated, during actions such as location reporting. */
  override fun updateStatus(statusLevel: StatusLevel, statusCode: StatusCode, statusMsg: String) {
    // 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 に関する注意事項

Driver SDK の実装では、内部的に 安全な通信を実現する SSL/TLS Fleet Engine サーバーと 通信する必要があります古いバージョンの Android(API バージョン 19 または それより低いもの)と通信するには、SecurityProvider パッチが必要になる場合があります。 あります。次のように表示されます。 記事 をご覧ください。また、この記事には セキュリティ プロバイダにパッチを適用するためのコードサンプルが含まれています。

位置情報の更新を有効にする

*VehicleReporter インスタンスを取得したら、位置情報の更新を有効にします。 明白:

Java

RidesharingVehicleReporter reporter = ...;

reporter.enableLocationTracking();

Kotlin

val reporter = ...

reporter.enableLocationTracking()

車両状態が ONLINEreporter.enableLocationTracking() を呼び出しても、 車両の状態が自動的に ONLINE に設定されます。必要なこと 明示的に車両の状態を設定する必要があります。

デフォルトのレポート間隔は 10 秒です。レポート間隔は reporter.setLocationReportingInterval(long, TimeUnit) で変更できます。「 サポートされる最小更新間隔は 5 秒です。より頻繁なアップデートにより、 リクエストとエラーが遅くなります

位置情報の更新を無効にする

ドライバーのシフトが終了したら、位置情報の更新を停止して、 オフラインとマークされた車両を DeliveryVehicleReporter.disableLocationTracking または RidesharingVehicleReporter.disableLocationTracking

この通話により、最後の更新が即時配信されるようにスケジュールされます。 は、車両がオフラインであることを示します。このアップデートには、ユーザーの あります。

車両の状態の設定

位置情報の更新が有効になっている場合、車両の状態を ONLINE に設定すると SearchVehicles のクエリに車両を利用できるようにする同様に、 OFFLINE とマークすると、車両は使用不可としてマークされます。

車両の状態をサーバー側で設定できます( 車両)、 Driver SDK で直接行う場合:

Java

RidesharingVehicleReporter reporter = ...;

reporter.enableLocationTracking();
reporter.setVehicleState(VehicleState.ONLINE);

Kotlin

val reporter = ...

reporter.enableLocationTracking()
reporter.setVehicleState(VehicleState.ONLINE)

位置情報の更新が有効になっている場合、setVehicleState への呼び出しは 次回の現在地更新時に通知を受け取れます

位置情報追跡が有効になっていない場合に車両を ONLINE としてマークすると、 IllegalStateException 内。車両に OFFLINE のマークを付けることができるのは、次の場合です。 位置情報追跡がまだ有効になっていないか、明示的に無効になっています。これにより、 即座にアップデートされます。お客様への呼び出し RidesharingVehicleReporter.disableLocationTracking() のアクション 車両の状態を OFFLINE に設定する。

setVehicleState はすぐに返され、更新は 位置情報の更新スレッドです位置情報の更新、エラー、 車両の状態の更新は、オプションの DriverContextStatusListener を設定します。