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 コンソールでプロジェクトに対して次の操作を行います。
使用する新しい Google Cloud コンソール プロジェクトを作成するか、既存のプロジェクトを選択します。 使用します通知が届くまで数分 新しいプロジェクトが Google Cloud コンソールに表示されます。
デモアプリを実行するには、プロジェクトが Maps SDK にアクセスできる必要があります。 説明します。Google Cloud コンソールで、[ API とサービス >Library に移動し、Maps SDK for Android。
[API キーを取得] を選択して、プロジェクトの API キーを取得します。 API とサービス >クルデンシャル >認証情報を作成 >API キー。 API キーの取得について詳しくは、以下をご覧ください。 API キーを取得します。
アプリに Consumer SDK を追加する
Consumer SDK は非公開の Maven リポジトリから入手できます。「 リポジトリには、SDK のプロジェクト オブジェクト モデル(.pom)ファイルと Javadocs が含まれています。 Consumer SDK をアプリに追加するには:
以下の説明に従って、ホスト Maven リポジトリにアクセスするように環境を設定します。 説明します。
依存関係の一元管理の構成を
settings.gradle
を無効にするには、次のように無効にします。settings.gradle
の次のコードブロックを削除します。import org.gradle.api.initialization.resolve.RepositoriesMode dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() } }
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>
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 キーを保存するには:
ルートレベルの
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") } }
アプリレベルの
build.gradle
ファイルを開き、次のコードをplugins
要素。Groovy
id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
Kotlin
id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin")
Android Studio を使用している場合は、 プロジェクトを Gradle と同期します。
プロジェクト レベルのディレクトリで
local.properties
を開き、 使用します。YOUR_API_KEY
は実際の API キーに置き換えます。MAPS_API_KEY=YOUR_API_KEY
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
。ライドシェアリング
ConsumerMapView
と
ConsumerMapFragment
なので、以下に基づいて選ぶことができます。
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 機能は、 デフォルトで有効になっています。移動経路の共有経路にピントが合わせ、カメラがズームします。 表示されます。
カメラの動作をカスタマイズする
カメラの動作をより細かく制御する必要がある場合は、 ConsumerController.setAutoCameraEnabled() を使用して autocamera を設定できます。
ConsumerController.getCameraUpdate() は、その時点での推奨カメラ境界を返します。次に、この CameraUpdate
を引数として
GoogleMap.moveCamera() または GoogleMap.animateCamera()
ライドシェアリングや地図を利用できる
アプリでライドシェアリングと地図の操作をサポートするには、
送信先: ConsumerGoogleMap
、
ConsumerController
。
ConsumerMapFragment
、
ConsumerMapView
は両方とも非同期で返される
ConsumerGoogleMap
(ConsumerMapReadyCallback
)。
返品可能(返品手数料: ConsumerGoogleMap
)
getConsumerController()
から 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 を実装したら、
ルートの監視、更新情報のリッスン、エラー処理の機能を備えています。
以下の手順は、バックエンド サービスが用意されており、
消費者と車両をマッチングするサービスが運用されている。
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?, ) { // ... } // ... })
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 のエラー処理。