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
類別的可用方法。您可以將這些變數視為MapView
和MapFragment
類別,但支援導覽功能。 - 已移除的功能
- 部分 Google 地圖地圖項目因導航情境不合理,或有技術不相容的問題,因而遭到移除。已移除的功能包括:
- 街景服務。
- 精簡模式,不適合導航。
- 如果攝影機處於追蹤模式,就無法設定
LocationProvider
。這是因為導覽功能需要使用RoadSnappedLocationProvider
,如果切換至這個提供者,可能會導致導航時發生問題。 - 當相機處於追蹤模式時,套用最小/最大縮放等級和
LatLng
邊界不會有任何效果。 - 如果這些遺漏的功能對您造成困難,請與客戶代表聯絡。
遷移步驟
- 從建構作業 (即 Gradle) 中移除 Maps SDK for Android 整合。同時擁有兩個 SDK 將會導致編譯錯誤。
- 將
MapView
的執行個體替換為NavigationView
的執行個體。 - 將
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()
已移至NavigationView
和SupportNavigationFragment
。Camera.followMyLocation()
方法已移至GoogleMap
。
- 您可以將對
Camera.setLocation()
的呼叫替換為GoogleMap.moveCamera()
或GoogleMap.animateCamera()
。 - 已將
setOnFollowMyLocationCallback()
和isCameraFollowingMyLocation()
新增至GoogleMap
,以針對追蹤模式提供更多相關資訊。
步驟 3:合併活動流程
如果您先前使用 Navigation SDK 第 1 版,並按照上述指示操作,則地圖用途應該改為使用 NavigationView
類別,且導覽用途也已經改為使用 GoogleMap
。不過,您會有兩個 GoogleMap
例項和兩個 NavigationView
例項。這表示您仍使用的記憶體仍超過必要,而且在兩個執行個體間切換時,可能會導致使用者介面的流暢顯示作業暫停。如要解決這個問題,請合併活動/片段流程,讓這些流程可以共用單一例項。這可提供順暢的使用者體驗,並可簡化應用程式。