Places SDK for Android 中的自動完成服務會根據使用者搜尋查詢傳回地點預測。使用者輸入時,自動完成服務會傳回地點、地址、加號代碼和搜尋點等地點的建議。
您可以透過下列方式新增自動完成功能:
- 新增自動完成小工具以節省開發時間,並確保提供一致的使用者體驗。
- 透過程式取得地點預測,建立自訂使用者體驗。
新增自動完成小工具
自動完成小工具是一種搜尋對話方塊,內建自動完成功能。當使用者輸入搜尋字詞時,小工具就會顯示預測地點清單。當使用者做出選擇時,系統會傳回 Place
執行個體,讓您的應用程式用於取得所選地點的詳細資料。
在應用程式中加入自動完成小工具的方法有以下兩種:
方法 1:嵌入 AutocompleteSupportFragment
如要將 AutocompleteSupportFragment
新增到應用程式,請按照下列步驟操作:
- 在活動的 XML 版面配置中新增片段。
- 將事件監聽器新增到您的活動或片段。
將 AutocompleteSupportFragment 新增至活動
如要在活動中新增 AutocompleteSupportFragment
,請將新的片段新增至 XML 版面配置。例如:
<fragment android:id="@+id/autocomplete_fragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:name="com.google.android.libraries.places.widget.AutocompleteSupportFragment"
/>
- 根據預設,片段沒有邊框或背景。為了提供一致的視覺外觀,請在其他版面配置元素 (例如 CardView) 內建立片段的巢狀結構。
- 如果您使用自動完成片段,且需要覆寫
onActivityResult
,則必須呼叫super.onActivityResult
,否則片段會無法正常運作。
將 PlaceSelectionListener 新增至活動
PlaceSelectionListener
會回應傳回使用者選擇的地點。以下程式碼示範如何建立片段的參照,並將事件監聽器新增到您的 AutocompleteSupportFragment
中:
Java
// Initialize the AutocompleteSupportFragment. AutocompleteSupportFragment autocompleteFragment = (AutocompleteSupportFragment) getSupportFragmentManager().findFragmentById(R.id.autocomplete_fragment); // Specify the types of place data to return. autocompleteFragment.setPlaceFields(Arrays.asList(Place.Field.ID, Place.Field.NAME)); // Set up a PlaceSelectionListener to handle the response. autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() { @Override public void onPlaceSelected(@NonNull Place place) { // TODO: Get info about the selected place. Log.i(TAG, "Place: " + place.getName() + ", " + place.getId()); } @Override public void onError(@NonNull Status status) { // TODO: Handle the error. Log.i(TAG, "An error occurred: " + status); } });
Kotlin
// Initialize the AutocompleteSupportFragment. val autocompleteFragment = supportFragmentManager.findFragmentById(R.id.autocomplete_fragment) as AutocompleteSupportFragment // Specify the types of place data to return. autocompleteFragment.setPlaceFields(listOf(Place.Field.ID, Place.Field.NAME)) // Set up a PlaceSelectionListener to handle the response. autocompleteFragment.setOnPlaceSelectedListener(object : PlaceSelectionListener { override fun onPlaceSelected(place: Place) { // TODO: Get info about the selected place. Log.i(TAG, "Place: ${place.name}, ${place.id}") } override fun onError(status: Status) { // TODO: Handle the error. Log.i(TAG, "An error occurred: $status") } })
選項 2:使用意圖啟動自動完成活動
如果您希望應用程式使用不同的導覽流程 (例如,透過圖示而非搜尋欄位來觸發自動完成功能),應用程式可以使用意圖來啟動自動完成功能。
如要使用意圖啟動自動完成小工具,請按照下列步驟操作:
- 使用
Autocomplete.IntentBuilder
建立意圖,並傳送所需的Autocomplete
模式。意圖必須呼叫startActivityForResult
,並傳入可識別意圖的要求代碼。 - 覆寫
onActivityResult
回呼以接收所選地點。
建立自動完成意圖
以下範例使用 Autocomplete.IntentBuilder
建立意圖,以啟動自動完成小工具做為意圖:
Java
private static int AUTOCOMPLETE_REQUEST_CODE = 1; // Set the fields to specify which types of place data to // return after the user has made a selection. List<Place.Field> fields = Arrays.asList(Place.Field.ID, Place.Field.NAME); // Start the autocomplete intent. Intent intent = new Autocomplete.IntentBuilder(AutocompleteActivityMode.FULLSCREEN, fields) .build(this); startActivityForResult(intent, AUTOCOMPLETE_REQUEST_CODE);
Kotlin
private val AUTOCOMPLETE_REQUEST_CODE = 1 // Set the fields to specify which types of place data to // return after the user has made a selection. val fields = listOf(Place.Field.ID, Place.Field.NAME) // Start the autocomplete intent. val intent = Autocomplete.IntentBuilder(AutocompleteActivityMode.FULLSCREEN, fields) .build(this) startActivityForResult(intent, AUTOCOMPLETE_REQUEST_CODE)
使用意圖啟動自動完成小工具時,您可以選擇重疊或全螢幕顯示模式。以下螢幕截圖分別顯示每個顯示模式:


覆寫 onActivityResult
回呼
如要在使用者選取地點時收到通知,應用程式應覆寫活動的 onActivityResult()
,檢查您針對意圖傳遞的要求代碼,如以下範例所示。
Java
@Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { if (requestCode == AUTOCOMPLETE_REQUEST_CODE) { if (resultCode == RESULT_OK) { Place place = Autocomplete.getPlaceFromIntent(data); Log.i(TAG, "Place: " + place.getName() + ", " + place.getId()); } else if (resultCode == AutocompleteActivity.RESULT_ERROR) { // TODO: Handle the error. Status status = Autocomplete.getStatusFromIntent(data); Log.i(TAG, status.getStatusMessage()); } else if (resultCode == RESULT_CANCELED) { // The user canceled the operation. } return; } super.onActivityResult(requestCode, resultCode, data); }
Kotlin
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { if (requestCode == AUTOCOMPLETE_REQUEST_CODE) { when (resultCode) { Activity.RESULT_OK -> { data?.let { val place = Autocomplete.getPlaceFromIntent(data) Log.i(TAG, "Place: ${place.name}, ${place.id}") } } AutocompleteActivity.RESULT_ERROR -> { // TODO: Handle the error. data?.let { val status = Autocomplete.getStatusFromIntent(data) Log.i(TAG, status.statusMessage ?: "") } } Activity.RESULT_CANCELED -> { // The user canceled the operation. } } return } super.onActivityResult(requestCode, resultCode, data) }
透過程式取得地點預測
您可以建立自訂搜尋 UI,做為自動完成小工具提供的 UI 替代方案。為了做到這一點,您的應用程式必須使用程式輔助方式取得地點預測。應用程式可透過呼叫 PlacesClient.findAutocompletePredictions()
並傳送包含以下參數的 FindAutocompletePredictionsRequest
物件,從自動完成 API 取得預測地點名稱及/或地址清單:
- 必要:包含使用者輸入文字的
query
字串。 - 建議做法:這個
AutocompleteSessionToken
會將使用者查詢的查詢和選取階段分組,以便進行帳單。工作階段會在使用者開始輸入查詢時開始,並在使用者選取地點時結束。 - 建議做法:
RectangularBounds
物件,用來指定將結果限制在指定的地區的經緯度邊界。 - 選填:一或多個由兩個字母組成的國家代碼s (ISO 3166-1 Alpha-2),表示結果受到限制的國家/地區。
選用:
TypeFilter
,可用於將結果限制為指定的地點類型。系統支援下列地點類型:TypeFilter.GEOCODE
– 只傳回地理編碼結果,而不會傳回商家。請使用此要求來區分可能定位的位置不明確的結果。TypeFilter.ADDRESS
- 只傳回包含精確地址的自動完成結果。如果您知道使用者想要指定完整的地址,請使用這種類型。TypeFilter.ESTABLISHMENT
- 只傳回商家。TypeFilter.REGIONS
- 只傳回符合以下任一類型的地點:LOCALITY
SUBLOCALITY
POSTAL_CODE
COUNTRY
ADMINISTRATIVE_AREA_LEVEL_1
ADMINISTRATIVE_AREA_LEVEL_2
TypeFilter.CITIES
— 只傳回符合LOCALITY
或ADMINISTRATIVE_AREA_LEVEL_3
的結果。
選用:
LatLng
用於指定要求的來源位置。當您呼叫setOrigin()
時,服務會針對回應中的每項自動完成預測,傳回指定來源的距離 (distanceMeters
),以公尺為單位。
如需地點類型的相關資訊,請參閱地點類型指南。
以下範例顯示對 PlacesClient.findAutocompletePredictions()
的完整呼叫。
Java
// Create a new token for the autocomplete session. Pass this to FindAutocompletePredictionsRequest, // and once again when the user makes a selection (for example when calling fetchPlace()). AutocompleteSessionToken token = AutocompleteSessionToken.newInstance(); // Create a RectangularBounds object. RectangularBounds bounds = RectangularBounds.newInstance( new LatLng(-33.880490, 151.184363), new LatLng(-33.858754, 151.229596)); // Use the builder to create a FindAutocompletePredictionsRequest. FindAutocompletePredictionsRequest request = FindAutocompletePredictionsRequest.builder() // Call either setLocationBias() OR setLocationRestriction(). .setLocationBias(bounds) //.setLocationRestriction(bounds) .setOrigin(new LatLng(-33.8749937,151.2041382)) .setCountries("AU", "NZ") .setTypesFilter(Arrays.asList(TypeFilter.ADDRESS.toString())) .setSessionToken(token) .setQuery(query) .build(); placesClient.findAutocompletePredictions(request).addOnSuccessListener((response) -> { for (AutocompletePrediction prediction : response.getAutocompletePredictions()) { Log.i(TAG, prediction.getPlaceId()); Log.i(TAG, prediction.getPrimaryText(null).toString()); } }).addOnFailureListener((exception) -> { if (exception instanceof ApiException) { ApiException apiException = (ApiException) exception; Log.e(TAG, "Place not found: " + apiException.getStatusCode()); } });
Kotlin
// Create a new token for the autocomplete session. Pass this to FindAutocompletePredictionsRequest, // and once again when the user makes a selection (for example when calling fetchPlace()). val token = AutocompleteSessionToken.newInstance() // Create a RectangularBounds object. val bounds = RectangularBounds.newInstance( LatLng(-33.880490, 151.184363), LatLng(-33.858754, 151.229596) ) // Use the builder to create a FindAutocompletePredictionsRequest. val request = FindAutocompletePredictionsRequest.builder() // Call either setLocationBias() OR setLocationRestriction(). .setLocationBias(bounds) //.setLocationRestriction(bounds) .setOrigin(LatLng(-33.8749937, 151.2041382)) .setCountries("AU", "NZ") .setTypesFilter(listOf(TypeFilter.ADDRESS.toString())) .setSessionToken(token) .setQuery(query) .build() placesClient.findAutocompletePredictions(request) .addOnSuccessListener { response: FindAutocompletePredictionsResponse -> for (prediction in response.autocompletePredictions) { Log.i(TAG, prediction.placeId) Log.i(TAG, prediction.getPrimaryText(null).toString()) } }.addOnFailureListener { exception: Exception? -> if (exception is ApiException) { Log.e(TAG, "Place not found: " + exception.statusCode) } }
API 會在
Task
中傳回 FindAutocompletePredictionsResponse
。FindAutocompletePredictionsResponse
包含 AutocompletePrediction
物件清單,代表預測的地點。如果查詢和篩選條件都沒有已知位置,則清單可能為空白。
針對每個預測的地點,您可以呼叫以下方法擷取地點詳細資訊:
getFullText(CharacterStyle)
會傳回地點說明的全文。這是主要與次要文字的組合。例如:「艾菲爾鐵塔, 南安大略大道、 巴黎、法國」。此外,此方法可讓您使用CharacterStyle
,以醒目方式顯示與搜尋條件相符的說明區段。CharacterStyle
為選用參數。如果不需要任何醒目顯示,請將其設為空值。getPrimaryText(CharacterStyle)
會傳回描述地點的主要文字。通常是地點名稱。例如:「艾菲爾鐵塔」和「中正路 123 號」。getSecondaryText(CharacterStyle)
會傳回地點說明的子文字。舉例來說,顯示自動完成預測時,第二行即可派上用場。例如:「Avenue Anatole France, Paris, France」和「Sydney, New South Wales」。getPlaceId()
會傳回預測地點的地點 ID。地點 ID 是文字識別碼,可識別特定地點,稍後可用來擷取Place
物件。如要進一步瞭解 Places SDK for Android 中的地點 ID,請參閱 Place Details。如需地點 ID 的一般資訊,請參閱 Place ID 總覽。getPlaceTypes()
會傳回與這個地點相關聯的地點類型清單。getDistanceMeters()
會傳回這個地點與要求中指定的起點之間的直線距離 (單位為公尺)。
工作階段符記
為求計費,工作階段符記會將使用者自動完成搜尋的查詢和選取階段分組為不同的工作階段。工作階段會在使用者開始輸入查詢時開始,並在使用者選取地點時結束。每個工作階段可以有多個查詢,然後再選取一個位置。工作階段結束後,權杖就不再有效;您的應用程式必須為每個工作階段產生一個新的權杖。我們建議您為所有程式輔助自動完成工作階段使用工作階段符記 (當您嵌入片段,或使用意圖啟動自動完成時,API 會自動處理此動作)。
Places SDK for Android 會使用 AutocompleteSessionToken
來識別每個工作階段。您的應用程式應在每次啟動新的工作階段時傳遞新的工作階段符記,接著在相同的 fetchPlace()
呼叫中,傳遞相同的憑證和地點 ID,擷取使用者所選地點的 Place Details。
限制自動完成結果
您可以將自動完成結果限制為特定地理區域,並/或篩選結果至一或多個地點類型,或最多篩選五個國家/地區。您可以將這些限制套用到自動完成活動、AutocompleteSupportFragment
和程式輔助自動完成 API。
如要限制結果,請執行下列操作:
- 如要偏好在定義的地區內傳回結果,請呼叫
setLocationBias()
(系統仍會傳回定義地區以外的部分結果)。 - 如要「只顯示」定義區域內的結果,請呼叫
setLocationRestriction()
(系統只會傳回定義區域內的結果)。 - 如要只傳回符合特定地點類型的結果,請呼叫
setTypesFilter()
(例如指定TypeFilter.ADDRESS
只傳回精確地址的結果)。 - 如要只傳回最多五個指定國家/地區的結果,請呼叫
setCountries()
。國家/地區必須以兩個字元搭配 ISO 3166-1 Alpha-2 相容國家/地區代碼。
偏誤到特定區域的結果
如欲將自動完成結果限定為特定地理區域,請呼叫 setLocationBias()
並傳遞 RectangularBounds
。以下程式碼範例示範在片段執行個體上呼叫 setLocationBias()
,以將自動完成建議調整成澳洲雪梨的某區域。
Java
autocompleteFragment.setLocationBias(RectangularBounds.newInstance( new LatLng(-33.880490, 151.184363), new LatLng(-33.858754, 151.229596)));
Kotlin
autocompleteFragment.setLocationBias( RectangularBounds.newInstance( LatLng(-33.880490, 151.184363), LatLng(-33.858754, 151.229596) ) )
將結果限制為特定地區
如要將自動完成結果限制為特定地理區域,請呼叫 setLocationRestriction()
並傳遞 RectangularBounds
。以下的程式碼範例顯示,在片段執行個體上呼叫 setLocationRestriction()
,會將其自動完成建議偏誤到澳洲雪梨的某個地區。
Java
autocompleteFragment.setLocationRestriction(RectangularBounds.newInstance( new LatLng(-33.880490, 151.184363), new LatLng(-33.858754, 151.229596)));
Kotlin
autocompleteFragment.setLocationRestriction( RectangularBounds.newInstance( LatLng(-33.880490, 151.184363), LatLng(-33.858754, 151.229596) ) )
注意:這項限制僅適用於整條路線,因此將範圍限制在矩形邊界之外的合成結果可能會與位置限制重疊。
依地點類型或類型集合篩選結果
您可以透過自動完成要求的結果限制,只傳回特定地點類型的結果。請使用地點類型或地點類型表 1、2 和 3 中列出的類型集合來指定篩選條件。如果未指定,則會傳回所有類型。
如要篩選自動完成結果,請呼叫 setTypesFilter()
以設定篩選器。
如何指定類型或類型集合篩選器:
呼叫
setTypesFilter()
並指定最多 5 個「type」值,這些屬性位於「地點類型」的表 1 和表 2 中。類型值是由 PlaceTypes 中的常數定義。呼叫
setTypesFilter()
並指定地點類型所示資料表 3 的類型集合。集合值是由 PlaceTypes 中的常數定義。在要求中只能使用表 3 中的一種類型。如果您指定了資料表 3 的值,就無法指定資料表 1 或資料表 2 的值。否則會發生錯誤。
以下程式碼範例對 AutocompleteSupportFragment
呼叫 setTypesFilter()
,並指定多個類型值。
Java
autocompleteFragment.setTypesFilter(Arrays.asList("landmark", "restaurant", "store"));
Kotlin
autocompleteFragment.setTypesFilter(listOf("landmark", "restaurant", "store"))
以下程式碼範例說明在 AutocompleteSupportFragment
上呼叫 setTypesFilter()
以設定篩選器,只傳回含有精確地址的結果,方法是指定類型集合。
Java
autocompleteFragment.setTypesFilter(Arrays.asList(TypeFilter.ADDRESS.toString()));
Kotlin
autocompleteFragment.setTypesFilter(listOf(TypeFilter.ADDRESS.toString()))
以下程式碼範例說明如何在 IntentBuilder
上呼叫 setTypesFilter()
,藉此設定篩選器,只透過指定類型集合,只傳回確切地址的結果。
Java
Intent intent = new Autocomplete.IntentBuilder( AutocompleteActivityMode.FULLSCREEN, fields) .setTypesFilter(Arrays.asList(TypeFilter.ADDRESS.toString())) .build(this); startActivityForResult(intent, AUTOCOMPLETE_REQUEST_CODE);
Kotlin
val intent = Autocomplete.IntentBuilder(AutocompleteActivityMode.FULLSCREEN, fields) .setTypesFilter(listOf(TypeFilter.ADDRESS.toString())) .build(this) startActivityForResult(intent, AUTOCOMPLETE_REQUEST_CODE)
依國家/地區篩選結果
如要篩選最多 5 個國家/地區的自動完成結果,請呼叫 setCountries()
來設定國家/地區代碼。接著,將篩選器傳送至片段或意圖。國家/地區必須以兩個字元搭配 ISO 3166-1 Alpha-2 相容國家/地區代碼。
以下程式碼範例顯示了針對 AutocompleteSupportFragment
呼叫 setCountries()
,以設定篩選器,以只傳回指定國家/地區內的結果。
Java
autocompleteFragment.setCountries("AU", "NZ");
Kotlin
autocompleteFragment.setCountries("AU", "NZ")
用量限制
Places API (包括 Places SDK for Android) 的使用方式不再受到每日要求上限 (QPD) 的限制。但仍須遵守以下用量限制:
- 頻率限制為每秒 100 次要求 (QPS)。計算方式是針對使用相同專案憑證的所有應用程式,執行用戶端與伺服器端的要求總和。
在應用程式中顯示歸因
- 如果您的應用程式以程式輔助方式使用自動完成服務,則 UI 必須顯示「由 Google 技術提供」的出處資訊,或是顯示在 Google 品牌地圖中。
- 如果您的應用程式使用自動完成小工具,則無須採取其他行動 (根據預設會顯示必要的屬性)。
- 如果您在依 ID 取得地點之後擷取及顯示其他地點資訊,您也必須顯示第三方出處資訊。
詳情請參閱歸因說明文件。
Place Autocomplete 最佳化
本節將說明最佳做法,協助您充分運用 Place Autocomplete 服務。
以下列出幾項一般準則:
- 如要開發有效的使用者介面,最快的方法就是使用 Maps JavaScript API Autocomplete 小工具、Places SDK for Android Autocomplete 小工具,或 Places SDK for iOS Autocomplete UI 控制項
- 從一開始就嘗試瞭解 Place Autocomplete 的必要資料欄位。
- 「位置自訂調整」和「位置限制」為自選欄位,但可能會對自動完成效能產生重大影響。
- 使用錯誤處理機制,可以減輕 API 傳回錯誤時對應用程式效能造成的影響。
- 確保應用程式能處理未選取任何項目的情況,以便使用者繼續操作。
費用最佳化最佳做法
基本費用最佳化
為了讓 Place Autocomplete 服務費用發揮最大效益,請使用 Place Details 和 Place Autocomplete 小工具中的欄位遮罩,只傳回所需的地點資料欄位。
進階費用最佳化
建議您透過程式輔助方式導入 Place Autocomplete,採用按請求計價,並要求已選地點 (而非 Place Details) 的相關 Geocoding API 結果。如果同時符合以下兩項條件,搭配 Geocoding API 使用「按要求」計價會比使用「按工作階段」(以工作階段為準) 計價更具成本效益:
- 如果您只需要針對使用者選取的地點取得經緯度或地址,透過 Geocoding API 擷取這項資訊,支付的費用會比使用 Place Details 呼叫更低。
- 如果使用者在平均四次以內的自動預測結果要求選取了自動預測結果,則「按要求」計價可能會比「按工作階段」計價更符合成本效益。
除了所選預測結果的地址和經緯度,應用程式是否需要任何其他資訊?
是,需要更多詳細資料
搭配 Place Details 使用以工作階段為準的 Place Autocomplete。
您的應用程式會要求 Place Details (例如地點名稱、商家狀態或營業時間),因此在導入 Place Autocomplete 時,建議使用工作階段符記 (透過程式輔助方式,或是內建於 JavaScript、Android 或 iOS 小工具),總費用為每個工作階段 $0.017 美元,再加上適用的地點資料 SKU (視您要求的地點資料欄位而定)1。
透過小工具導入
JavaScript、Android 或 iOS 小工具自動內建工作階段管理功能,其中包含對已選取的預測結果提出的 Place Autocomplete 要求和 Place Details 要求。請務必指定 fields
參數,確保您只要求所需的地點資料欄位。
透過程式輔助方式導入
搭配 Place Autocomplete 要求使用工作階段符記。要求所選預測結果的相關 Place Details 時,請加入下列參數:
- Place Autocomplete 回應中的地點 ID
- Place Autocomplete 要求中使用的工作階段符記
- 指定所需地點資料欄位的
fields
參數
否,只需要地址和位置資訊
對您的應用程式而言,Geocoding API 可能比 Place Details 更符合成本效益,視 Place Autocomplete 使用效能而定。每個應用程式的自動完成效率各不相同,可能取決於使用者輸入的內容、使用應用程式的位置,以及是否採用效能最佳化最佳做法。
為了找出以下問題的解答,請分析使用者在應用程式中選取 Place Autocomplete 預測結果前,平均輸入的字元數量。
使用者是否會在平均四次以內的要求中選取 Place Autocomplete 預測結果?
相容
透過程式輔助方式導入 Place Autocomplete,但不使用工作階段符記,並針對已選取的地點預測結果呼叫 Geocoding API。
Geocoding API 提供地址和經緯度座標,收費為每次要求 $0.005 美元。提出四次 Place Autocomplete - Per Request 要求的費用為 $0.01132 美元,因此如果將四次要求加上所選地點預測結果的相關 Geocoding API 呼叫,總費用就會是 $0.01632 美元,低於自動完成功能「按工作階段」計價的每個工作階段 $0.017 美元1。
建議您採用效能最佳做法,讓使用者以更少的字元找到需要的預測結果。
否
搭配 Place Details 使用以工作階段為準的 Place Autocomplete。
您預期使用者在選取 Place Autocomplete 預測結果前提出的平均要求數量,會超過「按工作階段」計價的費用,因此在導入 Place Autocomplete 時,建議針對 Place Autocomplete 要求和相關聯的 Place Details 要求都使用工作階段符記,總費用為每個工作階段 $0.017 美元1。
透過小工具導入
JavaScript、Android 或 iOS 小工具自動內建工作階段管理功能,其中包含對已選取的預測結果提出的 Place Autocomplete 要求和 Place Details 要求。請務必指定 fields
參數,確保只要求需要的 Basic Data 欄位。
透過程式輔助方式導入
搭配 Place Autocomplete 要求使用工作階段符記。要求所選預測結果的相關 Place Details 時,請加入下列參數:
- Place Autocomplete 回應中的地點 ID
- Place Autocomplete 要求中使用的工作階段符記
- 指定地址和幾何圖形等 Basic Data 欄位的
fields
參數
考慮延後 Place Autocomplete 要求
您可以運用一些策略,例如將 Place Autocomplete 要求延後到使用者輸入三或四個字元時再開始,藉此減少應用程式提出要求數量。舉例來說,如果您是在使用者輸入第三個字元「之後」才針對每個字元提出 Place Autocomplete 要求,那麼當使用者在輸入七個字元後,選取您透過單次 Geocoding API 要求帶出的一筆預測結果,總費用就是 $0.01632 美元 (4 * $0.00283 Autocomplete Per Request + $0.005 美元 Geocoding)1。
如果延後要求可以讓平均程式輔助要求少於四次,您可以按照使用 Geocoding API 提高 Place Autocomplete 效能的指南操作。請注意,如果使用者希望每輸入一個字就能看到預測結果,可能就會將延後要求視為時間上的延遲。
建議您採用效能最佳做法,讓使用者以更少的字元找到需要的預測結果。
-
這裡列出的費用是以美元計算。如需完整計價資訊,請參閱「Google 地圖平台計費方式」頁面。
效能最佳做法
以下準則說明如何將 Place Autocomplete 效能最佳化:
- 針對導入的 Place Autocomplete 加入國家/地區限制、位置自訂調整和 (適用於程式輔助導入) 語言偏好設定。小工具會從使用者的瀏覽器或行動裝置選擇語言偏好設定,因此不需要設定語言偏好。
- 如果 Place Autocomplete 附帶地圖,您就可以根據地圖可視區域進行位置自訂調整。
- 如果使用者沒有選擇任何自動預測結果 (通常是因為這些預測結果並非他們想要的地址),您可以重複使用原始使用者輸入內容,嘗試取得更相關的結果:
- 如果您預期使用者只會輸入地址資訊,請在 Geocoding API 呼叫中重複使用原始使用者輸入內容。
- 如果您預期使用者會依名稱或地址查詢某個地點,請使用「Find Place」要求。如果希望將結果範圍限制在特定區域,請使用位置自訂調整。
- 使用者輸入的次要場所地址,位於 Place Autocomplete 未能完整提供次要場所地址支援的國家/地區 (例如捷克、愛沙尼亞和立陶宛)。例如,捷克地址「Stroupežnického 3191/17, Praha」在 Place Autocomplete 中會產生不完整的預測結果。
- 使用者輸入的地址含有路段前置字元,例如紐約的「23-30 29th St, Queens」或夏威夷考艾島的「47-380 Kamehameha Hwy, Kaneohe」。
疑難排解
雖然可能發生各種錯誤,但應用程式可能發生的大部分錯誤通常都是由設定錯誤 (例如使用錯誤的 API 金鑰,或 API 金鑰設定錯誤) 或配額錯誤 (應用程式已超出配額)。若要進一步瞭解配額,請參閱使用限制。
使用自動完成控制項發生的錯誤會在 onActivityResult()
回呼中傳回。呼叫 Autocomplete.getStatus()
取得結果的狀態訊息。