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 コンソールでプロジェクトに対して次の操作を行います。
使用する新しい Google Cloud コンソール プロジェクトを作成するか、既存のプロジェクトを選択します。 Driver SDK を使用します通知が届くまで数分 新しいプロジェクトが Google Cloud コンソールに表示されます。
デモアプリを実行するには、プロジェクトが Maps SDK にアクセスできる必要があります。 説明します。Google Cloud コンソールで、[ API とサービス >Library に移動し、Maps SDK for Android。
[API キーを取得] を選択して、プロジェクトの API キーを取得します。 API とサービス >クルデンシャル >認証情報を作成 >API キー。 API キーの取得について詳しくは、以下をご覧ください。 API キーを取得します。
Driver SDK をアプリに追加する
Driver SDK は Google Maven リポジトリから入手できます。「 リポジトリには、SDK のプロジェクト オブジェクト モデル(.pom)ファイルと Javadocs が含まれています。Driver SDK をアプリに追加するには:
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>
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 キーを保存するには:
ルートレベルの
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.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 を初期化するには:
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 } }, )
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()
DriverContext
オブジェクトを使用して*DriverApi
を初期化します。Java
RidesharingDriverApi ridesharingDriverApi = RidesharingDriverApi.createInstance(driverContext);
Kotlin
val ridesharingDriverApi = RidesharingDriverApi.createInstance(driverContext)
API オブジェクトから
RidesharingVehicleReporter
を取得します。 (*VehicleReporter
はNavigationVehicleReporter
を拡張します)。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()
車両状態が
ONLINE
。reporter.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
はすぐに返され、更新は
位置情報の更新スレッドです位置情報の更新、エラー、
車両の状態の更新は、オプションの
DriverContext
で StatusListener
を設定します。