本指南列出了使用 Navigation SDK for Android 的建構設定需求。本操作說明假設您已安裝 Android IDE,且熟悉 Android 開發作業。
使用 Navigation SDK 的基本需求
這些規定適用於 Android 版 Navigation SDK 4.99 以下版本。
已啟用 Navigation SDK 的 Google Cloud 控制台專案。如需預配資訊,請洽詢 Google 地圖平台代表。
應用程式的目標 API 級別必須為 30 以上。
如要執行使用 Navigation SDK 建構的應用程式,Android 裝置必須安裝並啟用 Google Play 服務。
您必須在應用程式中加入作者資訊和授權文字。
設定專案:Cloud 控制台專案和 Android 專案
建構或測試應用程式前,您需要先建立 Cloud 控制台專案,並新增 API 金鑰憑證。專案必須具備 Navigation SDK 存取權。Cloud 控制台專案中的所有金鑰都會取得同樣對 Navigation SDK 的存取權。一個鍵可以與多個開發專案相關聯。如果您已有控制台專案,就可以將金鑰新增至目前的專案。
如何設定
- 使用您偏好的網路瀏覽器登入 Cloud 控制台,建立 Cloud 控制台專案。
- 在 IDE (例如 Android Studio) 中建立 Android 應用程式開發專案,並記下套件名稱。
- 請與 Google 地圖平台代表聯絡,讓對方為您的 Cloud Console 專案提供 Navigation SDK 存取權。
- 在網路瀏覽器的 Cloud 控制台資訊主頁中,建立憑證以產生設有限制的 API 金鑰。
- 在「API 金鑰」頁面的「應用程式限制」部分中,按一下「Android 應用程式」。
- 按一下「Add the package name and fingerprint」(新增套件名稱和指紋),然後輸入開發專案的套件名稱和該金鑰的 SHA-1 指紋。
- 按一下 [儲存]。
在專案中加入 Navigation SDK
Navigation SDK 可透過 Maven 或 AAR 套件提供。建立開發專案後,您可以使用下列其中一種方法,將 SDK 整合至專案。
使用 Maven 安裝 Navigation SDK 4.5 以上版本 (建議)
下列內容會使用 google()
Maven 存放區,這是將 Navigation SDK 加入專案最簡單的建議方法
將以下依附元件新增至 Gradle 或 Maven 設定,並將
VERSION_NUMBER
預留位置替換成所需的 Navigation SDK for Android 版本。Gradle
請將以下內容加入模組層級
build.gradle
:dependencies { ... implementation 'com.google.android.libraries.navigation:navigation:VERSION_NUMBER' }
請注意,如果從原始 Maven 存放區升級,請注意群組和構件名稱已有所變更,因此不再需要
com.google.cloud.artifactregistry.gradle-plugin
外掛程式。並將以下內容新增至頂層
build.gradle
:allprojects { ... // Required: you must exclude the Google Play service Maps SDK from // your transitive dependencies. This is to ensure there won't be // multiple copies of Google Maps SDK in your binary, as the Navigation // SDK already bundles the Google Maps SDK. configurations { implementation { exclude group: 'com.google.android.gms', module: 'play-services-maps' } } }
Maven
請將以下內容新增至
pom.xml
:<dependencies> ... <dependency> <groupId>com.google.android.libraries.navigation</groupId> <artifactId>navigation</artifactId> <version>VERSION_NUMBER</version> </dependency> </dependencies>
如果您有任何使用 Maps SDK 的依附元件,就必須在每個依附於 Maps SDK 的已宣告依附元件中排除依附元件。
<dependencies> <dependency> <groupId>project.that.brings.in.maps</groupId> <artifactId>MapsConsumer</artifactId> <version>1.0</version> <exclusions> <!-- Navigation SDK already bundles Maps SDK. You must exclude it to prevent duplication--> <exclusion> <!-- declare the exclusion here --> <groupId>com.google.android.gms</groupId> <artifactId>play-services-maps</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
使用 Maven 搭配 Navigation SDK 4.5 以下版本,或搭配 Driver SDK
Navigation SDK 仍可透過 v4 版本的其餘部分繼續透過原始 Maven 存放區使用。這是與上述版本相同的程式庫,包含所有相同的更新,並在轉換期間提供與 Driver SDK 和其他程式庫的相容性。使用這個依附元件時,您必須在編譯時透過 gcloud
登入雲端專案。
- 按照 Consumer SDK 說明文件的「必要條件」一節所述,設定您的環境以存取 Google 的 Maven 存放區。您可以透過工作區群組控管 Navigation SDK 的存取權。
將下列依附元件新增至 Gradle 或 Maven 設定,並將
VERSION_NUMBER
預留位置替換為所需的 Navigation SDK 版本。Gradle
將以下內容新增至模組層級
build.gradle
:dependencies { ... implementation 'com.google.android.maps:navsdk:VERSION_NUMBER' }
並將以下內容新增至頂層
build.gradle
:allprojects { ... // Required: you must exclude the Google Play service Maps SDK from // your transitive dependencies. This is to ensure there won't be // multiple copies of Google Maps SDK in your binary, as the Navigation // SDK already bundles the Google Maps SDK. configurations { implementation { exclude group: 'com.google.android.gms', module: 'play-services-maps' } } }
Maven
請將以下內容新增至
pom.xml
:<dependencies> ... <dependency> <groupId>com.google.android.maps</groupId> <artifactId>navsdk</artifactId> <version>VERSION_NUMBER</version> </dependency> </dependencies>
如有任何依附元件使用 Maps SDK,請務必在每個依賴 Maps SDK 的宣告依附元件中,排除依附元件。
<dependencies> <dependency> <groupId>project.that.brings.in.maps</groupId> <artifactId>MapsConsumer</artifactId> <version>1.0</version> <exclusions> <!-- Navigation SDK already bundles Maps SDK. You must exclude it to prevent duplication--> <exclusion> <!-- declare the exclusion here --> <groupId>com.google.android.gms</groupId> <artifactId>play-services-maps</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
使用下載的 AAR 套件 (不建議)
Navigation SDK 也提供 AAR 套件。建立開發專案後,您可以整合 SDK。這些操作說明假設您使用 Android Studio 做為 IDE。
從共用的 Google 雲端硬碟下載最新版 Navigation SDK,並解壓縮。如果您沒有存取權,請聯絡您的代表。
在 Android Studio 中開啟專案,並使用 SDK Manager 新增 Google Play 服務套件。
從 ZIP 檔案目錄,將
libs/google_navigation_navmap.aar
複製到專案的app/libs
目錄。請將以下內容加入模組層級
build.gradle
:implementation(name: 'google_navigation_navmap', ext: 'aar')
然後將下列指令新增至頂層
build.gradle
:allprojects { ... // Required: you must exclude the Google Play service Maps SDK from // your transitive dependencies. This is to ensure there won't be // multiple copies of Google Maps SDK in your binary, as the Navigation // SDK already bundles the Google Maps SDK. configurations { implementation { exclude group: 'com.google.android.gms', module: 'play-services-maps' } } }
設定建構
建立專案後,您可以設定相關設定,以便成功建構 Navigation SDK 並加以使用。
更新本機屬性
- 在 Gradle Scripts 資料夾中,開啟
local.properties
檔案並新增android.useDeprecatedNdk=true
。
更新 Gradle 建構指令碼
請開啟
build.gradle (Module:app)
檔案,並依照下列規範更新設定,以符合 Navigation SDK 的規定,並考慮設定最佳化選項。Navigation SDK 的必要設定
- 將
minSdkVersion
設為 23 以上。 - 將
targetSdkVersion
設為 30 以上。 - 新增可增加
javaMaxHeapSize
的dexOptions
設定。 - 設定其他程式庫的位置。
- 新增 Navigation SDK 的
repositories
和dependencies
。 - 將依附元件中的版本號碼替換為最新可用版本。
縮短建構時間的選用設定
- 使用 R8/ProGuard 啟用程式碼縮減和資源縮減功能,從依附元件中移除未使用的程式碼和資源。如果 R8/ProGuard 步驟的執行時間過長,請考慮為開發工作啟用 Multidex。
- 減少建構作業包含的語言翻譯數量:在開發期間為一種語言設定
resConfigs
。針對最終版本,請為實際使用的語言設定resConfigs
。根據預設,Gradle 會為 Navigation SDK 支援的所有語言納入資源字串。
- 將
以下提供應用程式的 Gradle 建構指令碼範例。請查看範例應用程式的更新依附元件集,因為您使用的 Navigation SDK 版本可能會比本說明文件稍早或稍晚。
apply plugin: 'com.android.application'
apply plugin: 'com.google.cloud.artifactregistry.gradle-plugin'
ext {
androidxVersion = "1.0.0"
lifecycle_version = "1.1.1"
}
android {
compileSdkVersion 30
buildToolsVersion '28.0.3'
defaultConfig {
applicationId "<your id>"
// Navigation SDK supports SDK 23 and later.
minSdkVersion 23
targetSdkVersion 30
versionCode 1
versionName "1.0"
// Set this to the languages you actually use, otherwise you'll include resource strings
// for all languages supported by the Navigation SDK.
resConfigs "en"
multiDexEnabled true
}
dexOptions {
// This increases the amount of memory available to the dexer. This is required to build
// apps using the Navigation SDK.
javaMaxHeapSize "4g"
}
buildTypes {
// Run ProGuard. Note that the Navigation SDK includes its own ProGuard configuration.
// The configuration is included transitively by depending on the Navigation SDK.
// If the ProGuard step takes too long, consider enabling multidex for development work
// instead.
all {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
// This tells Gradle where to look to find additional libraries - in this case, the
// google_navigation_navmap.aar file.
repositories {
flatDir {
dirs 'libs'
}
google()
// Required for accessing the Navigation SDK on Google's Maven repository.
maven {
url "artifactregistry://us-west2-maven.pkg.dev/gmp-artifacts/transportation"
}
}
dependencies {
// Include the Google Navigation SDK
implementation 'com.google.android.maps:navsdk:4.4.0'
// The included AAR file under libs can be used instead of the Maven repository.
// Uncomment the line below and comment out the previous dependency to use
// the AAR file instead. Ensure that you add the AAR file to the libs directory.
// implementation(name: 'google_navigation_navmap', ext: 'aar')
// These dependencies are required for the Navigation SDK to function
// properly at runtime.
implementation 'org.chromium.net:cronet-fallback:69.3497.100'
// Optional for Cronet users:
// implementation 'org.chromium.net:cronet-api:69.3497.100'
implementation 'androidx.appcompat:appcompat:${androidxVersion}'
implementation 'androidx.cardview:cardview:${androidxVersion}'
implementation 'com.google.android.material:material:${androidxVersion}'
implementation 'androidx.mediarouter:mediarouter:${androidxVersion}'
implementation 'androidx.preference:preference:${androidxVersion}'
implementation 'androidx.recyclerview:recyclerview:${androidxVersion}'
implementation 'androidx.legacy:legacy-support-v4:${androidxVersion}'
implementation 'com.github.bumptech.glide:glide:4.9.0'
implementation 'com.github.bumptech.glide:okhttp-integration:4.9.0'
implementation 'android.arch.lifecycle:common-java8:$lifecycle_version'
implementation 'com.android.support:multidex:1.0.3'
implementation 'com.google.android.datatransport:transport-api:2.2.0'
implementation 'com.google.android.datatransport:transport-backend-cct:2.2.0'
implementation 'com.google.android.datatransport:transport-runtime:2.2.0'
implementation 'joda-time:joda-time:2.9.9'
annotationProcessor 'androidx.annotation:annotation:1.1.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
}
在應用程式中加入 API 金鑰
本節將說明如何儲存 API 金鑰,讓應用程式以安全的方式參照金鑰。API 金鑰不應該登錄在版本管控系統中;我們建議將金鑰儲存在位於專案根目錄的 secrets.properties
檔案內。如要進一步瞭解 secrets.properties
檔案,請參閱這篇文章中關於 Gradle 屬性檔案的說明。
建議您使用 Secrets Gradle Plugin for Android 來簡化這項工作。
如要在 Google 地圖專案中安裝 Secrets Gradle Plugin for Android,請按照下列步驟操作:
-
在 Android Studio 中開啟頂層的
build.gradle.kts
或build.gradle
檔案, 然後將下列程式碼加進buildscript
下方的dependencies
元素。Kotlin
buildscript { dependencies { classpath("com.google.android.libraries.mapsplatform.secrets-gradle-plugin:secrets-gradle-plugin:2.0.1") } }
Groovy
buildscript { dependencies { classpath "com.google.android.libraries.mapsplatform.secrets-gradle-plugin:secrets-gradle-plugin:2.0.1" } }
-
開啟模組層級的
build.gradle.kts
或build.gradle
檔案,然後將下列程式碼加進plugins
元素。Kotlin
plugins { // ... id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin") }
Groovy
plugins { // ... id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin' }
- 在模組層級的
build.gradle.kts
或build.gradle
檔案中,確認targetSdk
和compileSdk
已設為 34。 - 儲存檔案,然後使用 Gradle 同步處理專案。
-
開啟頂層目錄中的
secrets.properties
檔案,並加入下列程式碼,然後將YOUR_API_KEY
替換成您的 API 金鑰。secrets.properties
不會登錄在版本管控系統中,因此請將金鑰儲存至該檔案。NAV_API_KEY=YOUR_API_KEY
- 儲存檔案。
-
在頂層目錄 (與
secrets.properties
檔案相同的資料夾) 中建立local.defaults.properties
檔案,然後加入下列程式碼。NAV_API_KEY=DEFAULT_API_KEY
如果找不到
secrets.properties
檔案,這個檔案便可做為 API 金鑰的備份位置,以確保建置程序不會失敗。如果您從略過secrets.properties
的版本管控系統複製應用程式,且尚未在本機建立secrets.properties
檔案來提供 API 金鑰,就可能會發生這種情況。 - 儲存檔案。
-
找到
AndroidManifest.xml
檔案中的com.google.android.geo.API_KEY
,並更新android:value attribute
。如果沒有<meta-data>
標記,請以<application>
標記子項的形式建立該標記。<meta-data android:name="com.google.android.geo.API_KEY" android:value="${MAPS_API_KEY}" />
注意:API 金鑰的建議中繼資料名稱為
com.google.android.geo.API_KEY
。具備這個名稱的金鑰可用來驗證 Android 平台上的多個 Google 地圖相關 API,包括 Navigation SDK for Android。為了兼顧回溯相容性,API 也支援com.google.android.maps.v2.API_KEY
這個名稱。此舊版名稱僅允許對 Android Maps API 第 2 版進行驗證。應用程式只能指定這兩種 API 金鑰中繼資料名稱的其中一個;如果同時指定兩者,API 就會擲回例外狀況。 -
在 Android Studio 中開啟模組層級的
build.gradle.kts
或build.gradle
檔案,然後編輯secrets
屬性。如果找不到secrets
屬性,請新增該屬性。編輯外掛程式的屬性,將
propertiesFileName
設為secrets.properties
、將defaultPropertiesFileName
設為local.defaults.properties
,並設定任何其他屬性。Kotlin
secrets { // To add your Maps API key to this project: // 1. If the secrets.properties file does not exist, create it in the same folder as the local.properties file. // 2. Add this line, where YOUR_API_KEY is your API key: // MAPS_API_KEY=YOUR_API_KEY propertiesFileName = "secrets.properties" // A properties file containing default secret values. This file can be // checked in version control. defaultPropertiesFileName = "local.defaults.properties" // Configure which keys should be ignored by the plugin by providing regular expressions. // "sdk.dir" is ignored by default. ignoreList.add("keyToIgnore") // Ignore the key "keyToIgnore" ignoreList.add("sdk.*") // Ignore all keys matching the regexp "sdk.*" }
Groovy
secrets { // To add your Maps API key to this project: // 1. If the secrets.properties file does not exist, create it in the same folder as the local.properties file. // 2. Add this line, where YOUR_API_KEY is your API key: // MAPS_API_KEY=YOUR_API_KEY propertiesFileName = "secrets.properties" // A properties file containing default secret values. This file can be // checked in version control. defaultPropertiesFileName = "local.defaults.properties" // Configure which keys should be ignored by the plugin by providing regular expressions. // "sdk.dir" is ignored by default. ignoreList.add("keyToIgnore") // Ignore the key "keyToIgnore" ignoreList.add("sdk.*") // Ignore all keys matching the regexp "sdk.*" }
在應用程式中加入必要的版權聲明
如果您在應用程式中使用 Android 版 Navigation SDK,必須在應用程式的法律聲明部分加入作者資訊文字和開放原始碼授權。
您可以在 Android 適用的 Navigation SDK .zip 檔案中找到必要的歸屬文字和開放原始碼授權:
NOTICE.txt
LICENSES.txt