移行ガイド

Google が v2 向け Navigation SDK に加えた最も大きな変更点は、いくつかの Navigation SDK クラスMaps SDK for Android の同等のクラスに置き換えたことです。

バージョン 2.2 では、Navigation SDK が Google Play 開発者サービス Maps API の(ほぼ)すぐに置き換えられるようになりました。すべての API を com.google.android.libraries.maps に再パッケージ化する代わりに、Google Play 開発者サービスと同様に com.google.android.gms.maps にパッケージ化しました。これにより、Google Play 開発者サービスのバージョンと Navigation SDK の切り替えがはるかに簡単になります。

利点

  • メモリ使用量の改善。Navigation SDK Maps SDK for Android の両方を使用した場合よりも、使用するメモリと帯域幅が少なくなります。
  • 地図表示モードからナビゲーション モードへの切り替えが、よりスムーズになり、操作しやすくなりました。
  • カメラをより細かく制御できるようになりました。
  • これで、ポリラインやオーバーレイを描画したり、地図にカスタム スタイルを追加したりできます。

ただし、ストリートビューやライトモードなどの機能はサポートされていません。

前提条件

  • Navigation SDK バージョン 2 では、高品質のアプリの作成を容易にするライブラリ、ツール、ガイダンスのスイートである Android Jetpack が使用されています。つまり、AndroidX を使用するには、サポート ライブラリの使用からアプリを移行する必要があります。詳しくは、AndroidX への移行をご覧ください。

ステップ 1: Maps SDK for Android から移行する

Maps SDK for Android の機能の大部分が、Navigation SDK バージョン 2 に含まれるようになりました。いくつかの機能は、ナビゲーションのコンテキストでは不要だったため削除されました。

重要な相違点

Maps SDK for Android は Google Play 開発者サービスに含まれていました。
Navigation SDK v2 にバンドルされている Maps SDK for Android の機能は、Maps SDK for Android の新しいバージョンをベースとしており、Google Play 開発者サービスには含まれていません。これらの新機能は、Google Play 開発者サービスのエンジンよりも新しいエンジンで動作し、いくつかの点で改善されています。また、地図は Google Play 開発者サービスのプロセスではなく、アプリのプロセス内で実行されます。
一部のクラスの名前を変更しました
次の表に、名前が変更されたクラスを示します。これは、対応する Maps SDK for Android と区別するために行われています。
Maps SDK for Android のクラス名Navigation SDK クラス名
MapView.java NavigationView.java
MapFragment.java SupportNavigationFragment.java
これらのクラスには、古い NavigationView クラスと現在の MapView クラスで利用可能なメソッドが含まれています。MapView クラスや MapFragment クラスに似ていますが、ナビゲーション サポートが含まれています。
削除された機能
一部のマップ機能は、ナビゲーションとの関連で合理的でない、または技術的な非互換性があるため、削除されました。削除された機能は次のとおりです。
  • ストリートビューが終了します。
  • ライトモード。ナビゲーションには不十分です。
  • カメラがフォローモードの場合、LocationProvider は設定できません。これは、ナビゲーションは RoadSnappedLocationProvider に依存しており、このプロバイダに切り替えるとナビゲーション時に問題が発生する可能性があるためです。
  • カメラがフォローモードのときは、最小/最大ズームと LatLng 境界を適用しても効果がありません。
  • これらの機能が足りない場合は、カスタマー担当者にご相談ください。

移行手順

  1. ビルド(Gradle)から Maps SDK for Android の統合を削除します。 両方の SDK を使用すると、コンパイル エラーが発生します。
  2. MapView のインスタンスを NavigationView のインスタンスに置き換えます。
  3. MapFragment のインスタンスを NavigationSupportFragment のインスタンスに置き換えます。

アプリケーションで Navigation SDK を使用していなかった場合は、移行は完了です。

手順 2. Navigation SDK の v1.x から移行する

Navigation SDK の v1.x 統合を v2 に移行するには、次の手順を行います。

1. 新しいメソッドを使用して地図を取得する

地図の表示方法が変わりました。v2 より前のバージョンでは、同期呼び出しを使用して地図を取得していました。ここでは、非同期呼び出しを使用します。次の表に、地図を取得するための古いメソッドと新しいメソッドを示します。

以前の方法新しいメソッド
NavigationView.getMap() NavigationView.getMapAsync()
SupportNavigationFragment.getMap() SupportNavigationFragment.getMapAsync()

2. ライブラリを移行する

Navigation SDK v1.x には、いくつかの Maps SDK for Android クラスの独自の実装が含まれていました。これらのクラスは com.google.android.libraries.navigation パッケージに属していました。

v2 では、これらのクラスは、com.google.android.gms.maps.model パッケージにある Maps SDK for Android 実装に置き換えられています。検索と置換を行うことで、アプリを移行して新しいクラスを統合できます。

次の表に、古いクラスと新しいクラスを示します。

旧クラス新しいクラス
com.google.android.libraries.navigation.LatLng com.google.android.gms.maps.model.LatLng
com.google.android.libraries.navigation.LatLngBounds com.google.android.gms.maps.model.LatLngBounds
com.google.android.libraries.navigation.Marker com.google.android.gms.maps.model.Marker
com.google.android.libraries.navigation.MarkerOptions com.google.android.gms.maps.model.MarkerOptions
com.google.android.libraries.navigation.VisibleRegion com.google.android.gms.maps.model.VisibleRegion

3.既存の API の変更に対応する

次の表に、Navigation SDK v2 に対して行われた主な変更点を示します。

メソッド変更
NavigationApi.cleanup() 削除しました。このメソッドは通常のオペレーションで使用されていないため、予期しない動作が発生する可能性があります。このメソッドの呼び出しを削除する必要があります。
RoadSnappedLocationProvider.requestLocationUpdates() 削除しました。addLocationListener() を代わりに使用してください。
RoadSnappedLocationProvider.stopRequestingLocationUpdates() 削除されました。removeLocationListener() を代わりに使用してください。

4. 新しい Marker クラスへの変更

Navigation SDK v2 では、Maps SDK for Android と同じ Marker クラスの実装が使用されます。これにより、次の変更が行われます。

メソッド変更
addMarker(MarkerOptions markerOptions) com.google.android.gms.maps.model.MarkerOptions クラスを使用するようになりました。
removeMarker(Marker marker) このメソッドは存在しません。代わりに、Marker クラスに marker.remove() メソッドが追加されました。
removeAllMarkers() このメソッドはもう存在しませんが、すべてのマーカー、ポリライン、ポリゴン、オーバーレイを地図から削除する clear() メソッドがあります。

MarkerOptions の違い

  • メソッド describeContents() は、Navigation SDK v2 には存在しません。これにより、onSaveInstanceState() を呼び出してビューデータを保存できました。今後は、構成が変更されたときにビューを再構築できるように、ビューの詳細を自分で追跡する必要があります。
  • navMarker#icon(BitMap) メソッドが mapMarker#icon(BitmapDescriptor) に変更されました。この変更に伴い、BitMap ではなく BitmapDescriptor を使用するように移行する必要があります。

マーカー メソッド

com.google.android.gms.maps.model パッケージの Marker クラスを使用します。次の表に、この新しい Marker クラスを使用する際の違いを示します。

メソッド変更
getAnchorU() 存在しません。
getAnchorV() 存在しません。
getIcon() もはや存在しません。
構成の変更後に地図の状態を再作成する必要がある場合に使用できるように、アイコンへの参照を自身で保持する必要があります。
getPosition() 引き続き存在します。
getTitle() 引き続き存在します。

5. カメラの操作

Navigation SDK v1.x で提供されているカメラ コントロールは、比較的限定されていました。バージョン 2 の Navigation SDK では、Maps SDK for Android で使用されているのと同じカメラモデルが使用されますが、Navigation SDK v1.x のものと同様の「フォローモード」を利用できる点が異なります。

主な違い

  • com.google.android.libraries.navigation.Camera クラスは v2 で削除されました。
    • Camera.showRouteOverview()NavigationViewSupportNavigationFragment に移動しました。
    • Camera.followMyLocation() メソッドが GoogleMap に移動しました。
  • Camera.setLocation() の呼び出しは、GoogleMap.moveCamera() または GoogleMap.animateCamera() に置き換えることができます。
  • フォローモードに関する詳細情報を提供するため、setOnFollowMyLocationCallback()isCameraFollowingMyLocation()GoogleMap に追加しました。

ステップ 3: マージ アクティビティ フロー

以前 Navigation SDK の V1 を使用していて、上記の手順を行っていた場合、地図のユースケースは NavigationView クラスを使用するように移行され、ナビゲーションのユースケースは GoogleMap を使用するように移行されたことになります。ただし、GoogleMap のインスタンスが 2 つ、NavigationView のインスタンスが 2 つあります。つまり、それでも必要以上のメモリが使用され、2 つのインスタンスを切り替えると、ユーザー インターフェースのスムーズなレンダリングにおいて、知覚できる一時停止が発生する可能性があります。この問題を解決するには、アクティビティとフラグメントのフローをマージして、単一のインスタンスを共有できるようにする必要があります。これにより、スムーズなユーザー エクスペリエンスが実現し、アプリが合理化されます。