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
境界を適用しても効果がありません。 - これらの機能が足りない場合は、カスタマー担当者にご相談ください。
移行手順
- ビルド(Gradle)から Maps SDK for Android の統合を削除します。 両方の SDK を使用すると、コンパイル エラーが発生します。
MapView
のインスタンスをNavigationView
のインスタンスに置き換えます。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()
がNavigationView
とSupportNavigationFragment
に移動しました。Camera.followMyLocation()
メソッドがGoogleMap
に移動しました。
Camera.setLocation()
の呼び出しは、GoogleMap.moveCamera()
またはGoogleMap.animateCamera()
に置き換えることができます。- フォローモードに関する詳細情報を提供するため、
setOnFollowMyLocationCallback()
とisCameraFollowingMyLocation()
をGoogleMap
に追加しました。
ステップ 3: マージ アクティビティ フロー
以前 Navigation SDK の V1 を使用していて、上記の手順を行っていた場合、地図のユースケースは NavigationView
クラスを使用するように移行され、ナビゲーションのユースケースは GoogleMap
を使用するように移行されたことになります。ただし、GoogleMap
のインスタンスが 2 つ、NavigationView
のインスタンスが 2 つあります。つまり、それでも必要以上のメモリが使用され、2 つのインスタンスを切り替えると、ユーザー インターフェースのスムーズなレンダリングにおいて、知覚できる一時停止が発生する可能性があります。この問題を解決するには、アクティビティとフラグメントのフローをマージして、単一のインスタンスを共有できるようにする必要があります。これにより、スムーズなユーザー エクスペリエンスが実現し、アプリが合理化されます。