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

Consumer SDK を使用すると、Google Chat と統合された基本的な オンデマンド配車と配達ソリューションのバックエンド サービスと統合します。新しい アクティブなルートを表示できる Trip and Order Progress アプリ ルート更新情報への応答、ルートエラーの処理を行います。

Consumer SDK はモジュラー アーキテクチャであるため、これらのパーツを 特定のアプリに使用する API を指定し、それらの API を 独自の API、Fleet Engine が提供するバックエンド サービス、 Google Maps Platform の追加 API です

最小システム要件

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

ビルドと依存関係の構成

Consumer SDK バージョン 1.99.0 以降は、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

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

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

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

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

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

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

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

アプリに Consumer SDK を追加する

Consumer SDK は非公開の Maven リポジトリから入手できます。「 リポジトリには、SDK のプロジェクト オブジェクト モデル(.pom)ファイルと Javadocs が含まれています。 Consumer SDK をアプリに追加するには:

  1. 以下の説明に従って、ホスト Maven リポジトリにアクセスするように環境を設定します。 説明します。

    依存関係の一元管理の構成を settings.gradle を無効にするには、次のように無効にします。

    • settings.gradle の次のコードブロックを削除します。

      import org.gradle.api.initialization.resolve.RepositoriesMode
      dependencyResolutionManagement {
          repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
          repositories {
              google()
              mavenCentral()
          }
      }
      
  2. Gradle または Maven の構成に次の依存関係を追加します。 目的のコンシューマ SDK バージョンの VERSION_NUMBER プレースホルダ。

    Gradle

    build.gradle に次の行を追加します。

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

    Maven

    pom.xml に次の行を追加します。

    <dependencies>
      ...
      <dependency>
        <groupId>com.google.android.libraries.mapsplatform.transportation</groupId>
        <artifactId>transportation-consumer</artifactId>
        <version>VERSION_NUMBER</version>
      </dependency>
    </dependencies>
    
  3. Consumer SDK は Maps SDK に依存しています。この依存関係は、Terraform 言語や Maps SDK のバージョンが明示的に定義されていない ビルド構成ファイルを次のように変更します。 リリース後も、Consumer SDK は引き続き、最小リソース数を使用 必要なサポート対象の Maps SDK バージョンです。

    Gradle

    build.gradle に次の行を追加します。

    dependencies {
      ...
      implementation 'com.google.android.gms:play-services-maps:18.1.0'
    }
    

    Maven

    pom.xml に次の行を追加します。

    <dependencies>
      ...
      <dependency>
        <groupId>com.google.android.gms</groupId>
        <artifactId>play-services-maps</artifactId>
        <version>18.1.0</version>
      </dependency>
    </dependencies>
    

アプリに API キーを追加する

Consumer 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.consumerapidemo">
    <uses-permission android:name="android.permission.ACCESS_FINE_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>

必要な帰属情報をアプリに含める

アプリで Consumer SDK を使用する場合は、 (アプリの法的通知の一部として含めることができる、帰属表示テキストおよびオープンソース ライセンス) できます。帰属情報は、独立したメニュー項目として、または [About] メニュー項目の一部。

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

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

コンシューマ SDK 認証

Consumer SDK は JSON ウェブトークンを使用した認証を提供します。 JSON Web Token(JWT)は JSON ベースのアクセス トークンで、 1 つ以上ありますたとえば、サーバーによって 「管理者としてログイン」というクレームを持つトークンその情報を 渡します。その後、クライアントはそのトークンを使用して、 管理者としてログインしていることです。

Consumer SDK は、アプリケーションが提供する JSON Web Token を使用します。 Fleet Engine と通信するために使用します。詳細については、フリート エンジンの認証と認可をご覧ください。

認証トークンには、tripid:TRIP_ID クレームをトークンの authorization ヘッダー。TRIP_ID はルート ID です。これによりコンシューマは 車両の位置、ルート、到着予定時刻などのルートの詳細への SDK アクセス権。

JSON Web Token のコールバック

Consumer SDK が認証トークンのコールバックを登録します。 初期化時にアプリケーションと 関連付けられる場合がありますSDK がアプリを呼び出す 認証が必要なすべてのネットワーク リクエストのトークンを取得する。

コールバック実装ではキャッシュ認証を expiry 時間が経過したときにのみ更新する必要があります。トークンは、 1 時間の有効期限で発行されます。

認証トークン コールバックは、必要なサービス トークンを指定する TripService サービス。また、必要な tripId も用意されています。 使用します。

次のコード例は、認証を実装する方法を示しています。 呼び出すことができます。

Java

class JsonAuthTokenFactory implements AuthTokenFactory {

  private static final String TOKEN_URL =
      "https://yourauthserver.example/token";

  private static class CachedToken {
    String tokenValue;
    long expiryTimeMs;
    String tripId;
  }

  private CachedToken token;

  /*
  * This method is called on a background thread. Blocking is OK. However, be
  * aware that no information can be obtained from Fleet Engine until this
  * method returns.
  */
  @Override
  public String getToken(AuthTokenContext context) {
    // If there is no existing token or token has expired, go get a new one.
    String tripId = context.getTripId();
    if (tripId == null) {
      throw new RuntimeException("Trip ID is missing from AuthTokenContext");
    }
    if (token == null || System.currentTimeMillis() > token.expiryTimeMs ||
        !tripId.equals(token.tripId)) {
      token = fetchNewToken(tripId);
    }
    return token.tokenValue;
  }

  private static CachedToken fetchNewToken(String tripId) {
    String url = TOKEN_URL + "/" + tripId;
    CachedToken token = new CachedToken();

    try (Reader r = new InputStreamReader(new URL(url).openStream())) {
      com.google.gson.JsonObject obj
          = com.google.gson.JsonParser.parseReader(r).getAsJsonObject();

      token.tokenValue = obj.get("ServiceToken").getAsString();
      token.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 5 minutes from that time.
      */
      token.expiryTimeMs -= 5 * 60 * 1000;
    } catch (IOException e) {
      /*
      * It's OK to throw exceptions here. The error listeners will receive the
      * error thrown here.
      */
      throw new RuntimeException("Could not get auth token", e);
    }
    token.tripId = tripId;

    return token;
  }
}

Kotlin

class JsonAuthTokenFactory : AuthTokenFactory() {

  private var token: CachedToken? = null

  /*
  * This method is called on a background thread. Blocking is OK. However, be
  * aware that no information can be obtained from Fleet Engine until this
  * method returns.
  */
  override fun getToken(context: AuthTokenContext): String {
    // If there is no existing token or token has expired, go get a new one.
    val tripId = 
      context.getTripId() ?: 
        throw RuntimeException("Trip ID is missing from AuthTokenContext")

    if (token == null || System.currentTimeMillis() > token.expiryTimeMs ||
        tripId != token.tripId) {
      token = fetchNewToken(tripId)
    }

    return token.tokenValue
  }

  class CachedToken(
    var tokenValue: String? = "", 
    var expiryTimeMs: Long = 0,
    var tripId: String? = "",
  )

  private companion object {
    const val TOKEN_URL = "https://yourauthserver.example/token"

    fun fetchNewToken(tripId: String) {
      val url = "$TOKEN_URL/$tripId"
      val token = CachedToken()

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

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

          token.tokenValue = obj.get("ServiceToken").getAsString()
          token.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 5 minutes from that time.
          */
          token.expiryTimeMs -= 5 * 60 * 1000
        }
      } catch (e: IOException) {
        /*
        * It's OK to throw exceptions here. The error listeners will receive the
        * error thrown here.
        */
        throw RuntimeException("Could not get auth token", e)
      }

      token.tripId = tripId

      return token
    }
  }
}

API を初期化する

以下の手順を行う前に、ユーザーが および一般ユーザー向け SDK で暗号化されます。

ConsumerApi インスタンスを取得する

Consumer SDK を使用するには、アプリで ConsumerApi を非同期で実行します。この API はシングルトンです。 初期化メソッドは AuthTokenFactory を受け取ります。ファクトリによって新しい ユーザーの JWT トークン(必要な場合)。

providerId は、Google Cloud プロジェクトのプロジェクト ID です。詳しくは、 Fleet Engine ユーザーガイド を参照してください。

アプリでは、次の説明に従って AuthTokenFactory を実装する必要があります。 コンシューマ SDK 認証

Java

Task<ConsumerApi> consumerApiTask = ConsumerApi.initialize(
    this, "myProviderId", authTokenFactory);

consumerApiTask.addOnSuccessListener(
  consumerApi -> this.consumerApi = consumerApi);

Kotlin

val consumerApiTask =
  ConsumerApi.initialize(this, "myProviderId", authTokenFactory)

consumerApiTask?.addOnSuccessListener { consumerApi: ConsumerApi ->
  this@YourActivity.consumerApi = consumerApi
}

Maps SDK とマップレンダラ

Consumer SDK v2.x.x は、Maps SDK for Android v18.1.0 以降をサポートしています。テーブル 以下は、Maps SDK バージョン別のデフォルトのレンダラとサポート状況をまとめたものです。 実装しますただし、必要な場合は最新のレンダラを使用することをおすすめします。 従来のレンダラを使用する場合は、 MapsInitializer.initialize()

Maps SDK のバージョン 最新のレンダラのサポート 従来のレンダラのサポート デフォルトのレンダラ
V18.1.0 以前 レガシー*
V18.2.0 最新

* 新しいマップレンダラのリリースに伴い、 [最新のレンダラ]がデフォルトになります

Maps SDK を依存関係として追加する

Gradle

build.gradle に次の行を追加します。

dependencies {
  //...
  implementation "com.google.android.gms:play-services-maps:VERSION_NUMBER"
}

Maven

pom.xml に次の行を追加します。

 <dependencies>
   ...
   <dependency>
     <groupId>com.google.android.gms</groupId>
     <artifactId>play-services-maps</artifactId>
     <version>18.1.0</version>
   </dependency>
 </dependencies>

Consumer SDK を初期化する前に Maps SDK を初期化する

Application またはスタートアップの Activity クラスで、次の関数を呼び出します。 MapsInitializer.initialize() リクエストの結果に基づいて Consumer SDK

Java

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  initViews();

  MapsInitializer.initialize(getApplicationContext(), Renderer.LATEST,
      new OnMapsSdkInitializedCallback() {
        @Override
        public void onMapsSdkInitialized(Renderer renderer) {
          switch (renderer) {
            case LATEST:
              Log.i("maps_renderer", "LATEST renderer");
              break;
            case LEGACY:
              Log.i("maps_renderer", "LEGACY renderer");
              break;
          }

          initializeConsumerSdk();
        }
      });
}

Kotlin

fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  setContentView(R.layout.main)
  initViews()

  MapsInitializer.initialize(
    getApplicationContext(), Renderer.LATEST,
    object : OnMapsSdkInitializedCallback() {
      fun onMapsSdkInitialized(renderer: Renderer?) {
        when (renderer) {
          LATEST -> Log.i("maps_renderer", "LATEST renderer")
          LEGACY -> Log.i("maps_renderer", "LEGACY renderer")
        }
        initializeConsumerSdk()
      }
    })
  }

ユーザー インターフェースを作成する

ConsumerMapFragment または ConsumerMapView を使用して、 説明します。ConsumerMapFragment を使用すると、 地図上で Fragment です。ConsumerMapView では、 View。ライドシェアリング ConsumerMapViewConsumerMapFragmentなので、以下に基づいて選ぶことができます。 View または このアプリケーションには Fragment が適しています。

API 19(KitKat)とベクター型ドローアブルのサポートを追加

API 19(KitKat)デバイスとベクター型ドローアブルをサポートする必要がある場合は、 アクティビティに次のコードを追加します。このコードは AppCompatActivity: Consumer SDK のベクター型ドローアブル

Java

// ...
import android.support.v7.app.AppCompatActivity;

// ...

public class ConsumerTestActivity extends AppCompatActivity {
  // ...
}

Kotlin

// ...
import android.support.v7.app.AppCompatActivity

// ...

class ConsumerTestActivity : AppCompatActivity() {
  // ...
}

地図のフラグメントまたはビューを追加する

Android フラグメントのいずれかでジャーニーの共有を表示するための地図を作成します。 またはビューです。ビューは、アプリケーション レイアウト XML ファイル( /res/layout)。フラグメント(またはビュー)がジャーニーへのアクセスを提供する アプリがアクセスして変更できる共有マップ。このマップには ConsumerController へのハンドル。これにより、アプリは 体験の共有をカスタマイズできます

移動経路の地図とコントローラの共有

ジャーニー共有マップは、フラグメント( ConsumerMapFragment)、またはビュー(ConsumerMapView を使用)として指定します。次に例を示します。 見てみましょう。次に、onCreate() メソッドは次の呼び出しを行います。 getConsumerGoogleMapAsync(callback)ConsumerGoogleMap を返します。 コールバックで非同期に指定できます。次に、ConsumerGoogleMap を使用して、 履歴は共有でき、アプリで必要に応じて更新できます。

ConsumerMapFragment

フラグメントは、次のスライドに示すように、アプリ レイアウト XML ファイルで定義します。 見てみましょう。

<fragment
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:name="com.google.android.libraries.mapsplatform.transportation.consumer.view.ConsumerMapFragment"
    android:id="@+id/consumer_map_fragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

getConsumerGoogleMapAsync() への呼び出しは onCreate() から行われる必要があります。 メソッドを呼び出します。

Java

public class SampleAppActivity extends AppCompatActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {

    // Find the ConsumerMapFragment.
    ConsumerMapFragment consumerMapFragment =
        (ConsumerMapFragment) fragmentManager.findFragmentById(R.id.consumer_map_fragment);

    // Initiate the callback that returns the map.
    if (consumerMapFragment != null) {
      consumerMapFragment.getConsumerGoogleMapAsync(
          new ConsumerMapReadyCallback() {
            // The map returned in the callback is used to access the ConsumerController.
            @Override
            public void onConsumerMapReady(@NonNull ConsumerGoogleMap consumerGoogleMap) {
              ConsumerController consumerController = consumerGoogleMap.getConsumerController();
            }
          });
    }
  }

}

Kotlin

class SampleAppActivity : AppCompatActivity() {
  override fun onCreate(savedInstanceState: Bundle?) {
    // Find the ConsumerMapFragment.
    val consumerMapFragment =
      fragmentManager.findFragmentById(R.id.consumer_map_fragment) as ConsumerMapFragment

    consumerMapFragment.getConsumerGoogleMapAsync(
      object : ConsumerMapReadyCallback() {
        override fun onConsumerMapReady(consumerGoogleMap: ConsumerGoogleMap) {
          val consumerController = consumerGoogleMap.getConsumerController()!!
        }
      }
    )
  }
}
ConsumerMapView

ビューは、 XML ファイル。

<com.google.android.libraries.mapsplatform.transportation.consumer.view.ConsumerMapView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/consumer_map_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

getConsumerGoogleMapAsync() の呼び出しは、onCreate() から行う必要があります。イン 含まれているアクティビティまたは フラグメント、設定を含む GoogleMapOptions(null でも可) MapView の属性。アクティビティまたはフラグメントの基本クラスは、次のいずれかである必要があります。 FragmentActivity またはサポート Fragment(それぞれ)です。これらは、 アクセスできます。

Java

public class SampleAppActivity extends AppCompatActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    ConsumerMapView mapView = findViewById(R.id.consumer_map_view);

    if (mapView != null) {
      mapView.getConsumerGoogleMapAsync(
          new ConsumerMapReadyCallback() {
            // The map returned in the callback is used to access the ConsumerController.
            @Override
            public void onConsumerMapReady(@NonNull ConsumerGoogleMap consumerGoogleMap) {
              ConsumerController consumerController = consumerGoogleMap.getConsumerController();
            }
          }, this, null);
    }
  }

}

Kotlin

class SampleAppActivity : AppCompatActivity() {
  override fun onCreate(savedInstanceState: Bundle?) {
    val mapView = findViewById(R.id.consumer_map_view) as ConsumerMapView

    mapView.getConsumerGoogleMapAsync(
      object : ConsumerMapReadyCallback() {
        // The map returned in the callback is used to access the ConsumerController.
        override fun onConsumerMapReady(consumerGoogleMap: ConsumerGoogleMap) {
          val consumerController = consumerGoogleMap.getConsumerController()!!
        }
      },
      /* fragmentActivity= */ this,
      /* googleMapOptions= */ null,
    )
  }
}

フラグメント内の MapView は、上記の例の MapView と同じです。 ただし、フラグメントは フラグメントの onCreateView() メソッド内の MapView

Java

public class MapViewInFragment extends Fragment {

  @Override
  public View onCreateView(
      @NonNull LayoutInflater layoutInflater,
      @Nullable ViewGroup viewGroup,
      @Nullable Bundle bundle) {
    return layoutInflater.inflate(R.layout.consumer_map_view, viewGroup, false);
  }

}

Kotlin

class MapViewInFragment : Fragment() {
  override fun onCreateView(
    layoutInflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?,
  ): View {
    return layoutInflater.inflate(R.layout.consumer_map_view, viewGroup, false)
  }
}

カメラのズームを調整してジャーニーにピントを合わせる

Maps SDK に組み込まれているデフォルトの現在地ボタンは、デバイスの位置にカメラを合わせます。

アクティブな移動経路の共有セッションがある場合は、カメラを中央に配置することをおすすめします。 デバイスの位置情報ではなく ジャーニーに集中できるからです

Consumer SDK for Android の組み込みソリューション: AutoCamera

デバイスの位置情報ではなくジャーニーに集中できるように、 Consumer SDK が提供する AutoCamera 機能は、 デフォルトで有効になっています。移動経路の共有経路にピントが合わせ、カメラがズームします。 表示されます。

AutoCamera

カメラの動作をカスタマイズする

カメラの動作をより細かく制御する必要がある場合は、 ConsumerController.setAutoCameraEnabled() を使用して autocamera を設定できます。

ConsumerController.getCameraUpdate() は、その時点での推奨カメラ境界を返します。次に、この CameraUpdate を引数として GoogleMap.moveCamera() または GoogleMap.animateCamera()

ライドシェアリングや地図を利用できる

アプリでライドシェアリングと地図の操作をサポートするには、 送信先: ConsumerGoogleMapConsumerControllerConsumerMapFragmentConsumerMapView は両方とも非同期で返される ConsumerGoogleMapConsumerMapReadyCallback)。 返品可能(返品手数料: ConsumerGoogleMapgetConsumerController() から ConsumerController。マイページ ConsumerGoogleMap と 次のように ConsumerController を設定します。

Java

private ConsumerGoogleMap consumerGoogleMap;
private ConsumerController consumerController;
private ConsumerMapView consumerMapView;

consumerMapView.getConsumerGoogleMapAsync(
    new ConsumerMapReadyCallback() {
      @Override
      public void onConsumerMapReady(@NonNull ConsumerGoogleMap consumerMap) {
        consumerGoogleMap = consumerMap;
        consumerController = consumerMap.getConsumerController();
      }
    },
    this, null);

Kotlin

var consumerGoogleMap: ConsumerGoogleMap
var consumerController: ConsumerController
val consumerMapView = findViewById(R.id.consumer_map_view) as ConsumerMapView

consumerMapView.getConsumerGoogleMapAsync(
  object : ConsumerMapReadyCallback() {
    override fun onConsumerMapReady(consumerMap: ConsumerGoogleMap) {
      consumerGoogleMap = consumerMap
      consumerController = consumerMap.getConsumerController()
    },
    /* fragmentActivity= */ this,
    /* googleMapOptions= */ null,
  }
)

ConsumerGoogleMap

ConsumerGoogleMap は、次のクラスのラッパークラスです。 GoogleMap クラス。これを使用すると 同等の API を使用して地図を操作できます。 GoogleMap。ユーザーマップを使うとアプリと配車サービスで 基盤となる GoogleMap とシームレスにやり取りできます。たとえば GoogleMap では 1 つのコールバックの登録しか許可されませんが、 ConsumerGoogleMap はデュアル登録コールバックをサポートしています。 これらのコールバックを使用すると、アプリとライドシェアリングは、 呼び出します。

ConsumerController

ConsumerController は、ライドシェアリング機能( ルートのモニタリング、ルートの状況の制御、場所の設定などができます。

ジャーニーの共有を設定する

バックエンドがコンシューマーと車両をマッチングしたら、JourneySharingSession を使用します。 共有ユーザーインターフェースを開始しましょう移動経路の共有では ルートを確認できますアプリに SDK を実装したら、 ルートの監視、更新情報のリッスン、エラー処理の機能を備えています。 以下の手順は、バックエンド サービスが用意されており、 消費者と車両をマッチングするサービスが運用されている。

  1. TripModel オブジェクトにリスナーを登録して、詳細情報を取得する 到着予定時刻や距離などのルート情報が 予測します。

    Java

    // Create a TripModel instance for listening to updates to the trip specified by this trip name.
    String tripName = ...;
    TripModelManager tripModelManager = consumerApi.getTripModelManager();
    TripModel tripModel = tripModelManager.getTripModel(tripName);
    
    // Create a JourneySharingSession instance based on the TripModel.
    JourneySharingSession session = JourneySharingSession.createInstance(tripModel);
    
    // Add the JourneySharingSession instance on the map for updating the UI.
    consumerController.showSession(session);
    
    // Register for trip update events.
    tripModel.registerTripCallback(new TripModelCallback() {
      @Override
      public void onTripETAToNextWaypointUpdated(
          TripInfo tripInfo, @Nullable Long timestampMillis) {
        // ...
      }
    
      @Override
      public void onTripActiveRouteRemainingDistanceUpdated(
          TripInfo tripInfo, @Nullable Integer distanceMeters) {
        // ...
      }
    
      // ...
    });
    

    Kotlin

    // Create a TripModel instance for listening to updates to the trip specified by this trip name.
    val tripName = "tripName"
    val tripModelManager = consumerApi.getTripModelManager()
    val tripModel = tripModelManager.getTripModel(tripName)
    
    // Create a JourneySharingSession instance based on the TripModel.
    val session = JourneySharingSession.createInstance(tripModel)
    
    // Add the JourneySharingSession instance on the map for updating the UI.
    consumerController.showSession(session)
    
    // Register for trip update events.
    tripModel.registerTripCallback(
      object : TripModelCallback() {
        override fun onTripETAToNextWaypointUpdated(
          tripInfo: TripInfo,
          timestampMillis: Long?,
        ) {
          // ...
        }
    
        override fun onTripActiveRouteRemainingDistanceUpdated(
          tripInfo: TripInfo,
          distanceMeters: Int?,
        ) {
          // ...
        }
    
      // ...
    })
    
  2. TripModelOptions を使用してルートを設定します。

    Java

    // Set refresh interval to 2 seconds.
    TripModelOptions tripOptions =
        TripModelOptions.builder().setRefreshIntervalMillis(2000).build();
    tripModel.setTripModelOptions(tripOptions);
    

    Kotlin

    // Set refresh interval to 2 seconds.
    val tripOptions = TripModelOptions.builder().setRefreshIntervalMillis(2000).build()
    tripModel.setTripModelOptions(tripOptions)
    

移動経路の共有を停止

ホスト アクティビティが破棄された場合など、不要になった場合はジャーニーの共有を停止してください。ジャーニーの共有を停止すると、Fleet Engine へのネットワーク リクエストも停止し、メモリリークを防ぐことができます。

次のサンプルコードは、乗車経路の共有を停止する方法を示しています。

Java

public class MainActivity extends AppCompatActivity
    implements ConsumerViewModel.JourneySharingListener  {

  // Class implementation

  @Override
  protected void onDestroy() {
    super.onDestroy();

    if (journeySharingSession != null) {
      journeySharingSession.stop();
    }
  }
}

Kotlin

class SampleAppActivity : AppCompatActivity(), ConsumerViewModel.JourneySharingListener {

  // Class implementation

  override fun onDestroy() {
    super.onDestroy()

    journeySharingSession?.stop()
  }
}

ルートエラーを処理する

onTripRefreshError メソッドは、ルートのモニタリング中に発生したエラーを表示します。 Consumer SDK のマッピング 確立された HTTP/RPC ガイドラインに従って、 Google Cloud Platform。 ルートのモニタリング中によく見られるエラーには、次のようなものがあります。

HTTP RPC 説明
400 INVALID_ARGUMENT クライアントが無効なルート名を指定しました。「 旅行名は次の形式で指定してください providers/{provider_id}/trips/{trip_id}provider_id は サービス プロバイダが所有する Cloud プロジェクト。
401 未認証 リクエストが認証されませんでした JWT トークンが無効です。このエラーが発生する JWT トークンがルートなしで署名されているかどうか JWT トークンの有効期限が切れています。
403 PERMISSION_DENIED クライアントに十分な 付与します。このエラーは、JWT の登録が トークンが無効である場合、クライアントに API が有効になっていないか、サービス アカウント 構成する必要があります。JWT トークンは、 トークンがルートで署名されている リクエストされたルート ID と一致しない ID です。
429 RESOURCE_EXHAUSTED リソースの割り当てがゼロまたはレートが 超えています。
503 利用不可 サービス利用不可。通常はサーバー ダウンしています。
504 DEADLINE_EXCEEDED リクエスト期限を超えました。これにより、 呼び出し元が期限を設定した場合のみ処理が行われる メソッドのデフォルトよりも短い (すなわち、リクエストされた期限が サーバーがリクエストを処理するのに リクエストが完了しなかった 行うこともできます。

詳細については、次をご覧ください: Consumer SDK のエラー処理