本指南列出使用 Android 版 Navigation SDK 的建構設定需求。本操作說明假設您已安裝 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 Console,然後建立 Cloud Console 專案。
- 在 IDE (例如 Android Studio) 中建立 Android 應用程式開發專案,並記下套件名稱。
- 請與 Google 地圖平台代表聯絡,讓對方為您的 Cloud Console 專案提供 Navigation SDK 存取權。
- 在網路瀏覽器的 Cloud 控制台資訊主頁中建立憑證,以產生含有限制的 API 金鑰。
- 在「API 金鑰」頁面上,點選「應用程式限制」區域中的「Android 應用程式」。
- 按一下「Add the package name and fingerprint」(新增套件名稱和指紋),然後輸入開發專案的套件名稱和該金鑰的 SHA-1 指紋。
- 按一下 [儲存]。
將 Navigation SDK 新增至專案
您可以透過 Maven 取得 Navigation SDK,也可以取得 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
您仍可透過原始 Maven 存放區取得 Navigation SDK,但僅限於第 4 版的其餘版本。這是與上述版本相同的程式庫,包含所有相同的更新,並在轉換期間提供與 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}" />
注意:
com.google.android.geo.API_KEY
是 API 金鑰的建議中繼資料名稱。具備這個名稱的金鑰可用來驗證 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