遷移指南

Google 對 Navigation SDK 第 2 版做出的最大變更,是將數個 Navigation SDK 類別替換為與 Maps SDK for Android 的對應項目。

自 2.2 版起,Navigation SDK 是 (即將) 取代 Google Play Services Maps API 的工具。這些 API 跟 Google Play 服務一樣,不會封裝到 com.google.android.library.maps 中,而是封裝在 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 第 2 版隨附的 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 類別的可用方法。您可以將這些變數視為 MapViewMapFragment 類別,但支援導覽功能。
已移除的功能
部分 Google 地圖地圖項目因導航情境不合理,或有技術不相容的問題,因而遭到移除。已移除的功能包括:
  • 街景服務。
  • 精簡模式,不適合導航。
  • 如果攝影機處於追蹤模式,就無法設定 LocationProvider。這是因為導覽功能需要使用 RoadSnappedLocationProvider,如果切換至這個提供者,可能會導致導航時發生問題。
  • 當相機處於追蹤模式時,套用最小/最大縮放等級和 LatLng 邊界不會有任何效果。
  • 如果這些遺漏的功能對您造成困難,請與客戶代表聯絡。

遷移步驟

  1. 從建構作業 (即 Gradle) 中移除 Maps SDK for Android 整合。同時擁有兩個 SDK 將會導致編譯錯誤。
  2. MapView 的執行個體替換為 NavigationView 的執行個體。
  3. MapFragment 的執行個體替換為 NavigationSupportFragment 的執行個體。

如果您的應用程式先前未使用 Navigation SDK,則已完成遷移作業。

步驟 2:從 Navigation SDK 1.x 版遷移

請執行下列步驟,將 Navigation SDK 的 v1.x 整合功能遷移至第 2 版。

1. 使用新方法取得地圖

取得地圖的方式已變更,在第 2 版之前,您可以使用同步呼叫來取得地圖。現在請使用非同步呼叫。下表列出舊方法以及取得地圖的新方法。

舊方法新方法
NavigationView.getMap() NavigationView.getMapAsync()
SupportNavigationFragment.getMap() SupportNavigationFragment.getMapAsync()

2. 遷移程式庫

Navigation SDK 的 1.x 版包含自己的數個 Maps SDK for Android 類別實作方式。這些類別屬於 com.google.android.libraries.navigation 套件。

在第 2 版中,這些類別已替換為 Maps SDK for Android 實作項目,詳情請參閱 com.google.android.gms.maps.model 套件。您可以執行搜尋和取代作業,遷移應用程式以整合新類別。

下表列出和新的類別。

舊課程新課程
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 的變更

下表列出 Google 對 Navigation SDK 第 2 版做出的重大變更。

方法轉乘
NavigationApi.cleanup() 已移除。這個方法並未用於正常作業,可能會產生無法預期的行為。您必須移除對這個方法的呼叫。
RoadSnappedLocationProvider.requestLocationUpdates() 已移除。請改用 addLocationListener()
RoadSnappedLocationProvider.stopRequestingLocationUpdates() 已移除。請改用 removeLocationListener()

4. 變更為新的 Marker 類別

Navigation SDK 第 2 版現在採用與 Maps SDK for Android 相同的 Marker 類別實作方式。這會帶來下列異動。

方法轉乘
addMarker(MarkerOptions markerOptions) 現在使用 com.google.android.gms.maps.model.MarkerOptions 類別。
removeMarker(Marker marker) 此方法已不存在。但 Marker 類別現在有 marker.remove() 方法。
removeAllMarkers() 這個方法已不存在,不過可透過 clear() 方法從地圖中移除所有標記、折線、多邊形和疊加層。

MarkerOptions 差異

  • Navigation SDK 第 2 版沒有 describeContents() 方法。可讓您呼叫 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 1.x 版中提供的相機控制項較為有限。現在 Navigation SDK 第 2 版採用的相機模型與 Maps SDK for Android 相同,不過您也會取得類似於 Navigation SDK v1.x 版的追蹤模式

主要差異

  • com.google.android.libraries.navigation.Camera 類別已從第 2 版中移除。
    • Camera.showRouteOverview() 已移至 NavigationViewSupportNavigationFragment
    • Camera.followMyLocation() 方法已移至 GoogleMap
  • 您可以將對 Camera.setLocation() 的呼叫替換為 GoogleMap.moveCamera()GoogleMap.animateCamera()
  • 已將 setOnFollowMyLocationCallback()isCameraFollowingMyLocation() 新增至 GoogleMap,以針對追蹤模式提供更多相關資訊。

步驟 3:合併活動流程

如果您先前使用 Navigation SDK 第 1 版,並按照上述指示操作,則地圖用途應該改為使用 NavigationView 類別,且導覽用途也已經改為使用 GoogleMap。不過,您會有兩個 GoogleMap 例項和兩個 NavigationView 例項。這表示您仍使用的記憶體仍超過必要,而且在兩個執行個體間切換時,可能會導致使用者介面的流暢顯示作業暫停。如要解決這個問題,請合併活動/片段流程,讓這些流程可以共用單一例項。這可提供順暢的使用者體驗,並可簡化應用程式。