Android 適用的 Places SDK 可為應用程式提供豐富的地點資訊,包括地點名稱和地址、以經緯度座標指定的地理位置、地點類型 (例如夜店、寵物店、博物館) 等等。如要存取特定地點的這項資訊,可以使用地點 ID。地點 ID 是用來識別特定地點的穩定 ID。
地點詳細資訊
Place
物件提供特定地點的相關資訊。您可以呼叫 PlacesClient.fetchPlace()
,取得 Place
物件。請參閱這份指南,瞭解如何依 ID 取得地點。
要求地點時,您必須指定要傳回的地點資料。如要這麼做,請傳遞 Place.Field 值清單,指定要傳回的資料。這份清單非常重要,因為會影響每項要求的費用。
地點資料結果不可空白,因此系統只會傳回含有資料的地點結果。舉例來說,如果要求的地點沒有相片,結果中就不會顯示 photos
欄位。
下列範例會傳遞三個 Place.Field 值清單,指定要求傳回的資料:
Kotlin
// Specify the fields to return. val placeFields = listOf(Place.Field.DISPLAY_NAME, Place.Field.RATING)
Java
// Specify the fields to return. final List<Place.Field> placeFields = Arrays.asList(Place.Field.DISPLAY_NAME, Place.Field.RATING);
存取 Place 物件資料欄位
取得 Place
物件後,請使用該物件的方法存取要求中指定的資料欄位。如果 Place
物件缺少欄位,相關方法會傳回空值。下方列舉幾個可用的方法。
getAddress()
:地點地址,格式清楚易懂。getAddressComponents()
:這個地點的地址元件List
。這些元件的用途是擷取地點地址的結構化資訊,例如找出地點所在的城市。請勿使用這些元件格式化地址,而是呼叫getAddress()
,這會提供本地化的格式化地址。getId()
:地點的文字 ID。如要進一步瞭解地點 ID,請參閱本頁其餘內容。getLatLng()
:地點的地理位置,以經緯度座標表示。getName()
:地點的名稱。getOpeningHours()
:地點的OpeningHours
。呼叫OpeningHours.getWeekdayText()
即可傳回字串清單,代表一週內每天的營業時間。呼叫OpeningHours.getPeriods()
可傳回period
物件清單,其中包含更多詳細資訊,相當於getWeekdayText()
提供的資料。Place
物件也包含getCurrentOpeningHours()
方法,可傳回地點未來七天的營業時間,以及getSecondaryOpeningHours()
方法,可傳回地點未來七天的次要營業時間。isOpen()
:布林值,指出地點目前是否營業中。如未指定時間,則預設為現在。只有在Place.Field.UTC_OFFSET
和Place.Field.OPENING_HOURS
都可用的情況下,系統才會傳回isOpen
。為確保結果準確,請在原始地點要求中要求Place.Field.BUSINESS_STATUS
和Place.Field.UTC_OFFSET
欄位。如未要求,系統會假設商家正常營業。 如要瞭解如何搭配 Place Details 使用isOpen
,請觀看這部影片。
以下提供一些例子:
Kotlin
val name = place.name val address = place.address val location = place.latLng
Java
final CharSequence name = place.getName(); final CharSequence address = place.getAddress(); final LatLng location = place.getLatLng();
依 ID 取得地點
地點 ID 是用來識別特定地點的文字 ID,在 Places SDK for Android 中,您可以呼叫 Place.getId()
擷取地點 ID。Place Autocomplete 服務也會針對符合所提供搜尋查詢和篩選條件的每個地點,傳回地點 ID。您可以儲存地點 ID,日後用於擷取 Place
物件。
如要依 ID 取得地點,請呼叫 PlacesClient.fetchPlace()
,並傳遞 FetchPlaceRequest
。
API 會在 Task
中傳回 FetchPlaceResponse
。FetchPlaceResponse
包含與所提供地點 ID 相符的 Place
物件。
下列程式碼範例顯示如何呼叫 fetchPlace()
,取得指定地點的詳細資料。
Kotlin
// Define a Place ID. val placeId = "INSERT_PLACE_ID_HERE" // Specify the fields to return. val placeFields = listOf(Place.Field.ID, Place.Field.NAME) // Construct a request object, passing the place ID and fields array. val request = FetchPlaceRequest.newInstance(placeId, placeFields) placesClient.fetchPlace(request) .addOnSuccessListener { response: FetchPlaceResponse -> val place = response.place Log.i(PlaceDetailsActivity.TAG, "Place found: ${place.name}") }.addOnFailureListener { exception: Exception -> if (exception is ApiException) { Log.e(TAG, "Place not found: ${exception.message}") val statusCode = exception.statusCode TODO("Handle error with given status code") } }
Java
// Define a Place ID. final String placeId = "INSERT_PLACE_ID_HERE"; // Specify the fields to return. final List<Place.Field> placeFields = Arrays.asList(Place.Field.ID, Place.Field.NAME); // Construct a request object, passing the place ID and fields array. final FetchPlaceRequest request = FetchPlaceRequest.newInstance(placeId, placeFields); placesClient.fetchPlace(request).addOnSuccessListener((response) -> { Place place = response.getPlace(); Log.i(TAG, "Place found: " + place.getName()); }).addOnFailureListener((exception) -> { if (exception instanceof ApiException) { final ApiException apiException = (ApiException) exception; Log.e(TAG, "Place not found: " + exception.getMessage()); final int statusCode = apiException.getStatusCode(); // TODO: Handle error with given status code. } });
取得營業狀態
PlacesClient.isOpen(IsOpenRequest request)
方法會傳回 IsOpenResponse
物件,指出地點目前是否營業中 (根據呼叫中指定的時間)。
這個方法會採用 IsOpenRequest
類型的單一引數,其中包含:
Place
物件,或指定地點 ID 的字串。- 選填時間值,指定自 1970 年 1 月 1 日 00:00:00 (世界標準時間) 起算的毫秒數。如未指定時間,則預設為現在。
這個方法需要 Place
物件中存在下列欄位:
Place.Field.BUSINESS_STATUS
Place.Field.CURRENT_OPENING_HOURS
Place.Field.OPENING_HOURS
Place.Field.UTC_OFFSET
如果 Place
物件中未提供這些欄位,或是您傳遞了地點 ID,這個方法就會使用 PlacesClient.fetchPlace()
擷取這些欄位。如要進一步瞭解如何使用必要欄位建立 Place 物件,請參閱「地點詳細資料」。
以下範例會判斷地點目前是否營業中。在本範例中,您只會將地點 ID 傳遞至 isOpen()
:
Kotlin
val isOpenCalendar: Calendar = Calendar.getInstance() val placeId = "ChIJD3uTd9hx5kcR1IQvGfr8dbk" val request: IsOpenRequest = try { IsOpenRequest.newInstance(placeId, isOpenCalendar.timeInMillis) } catch (e: IllegalArgumentException) { e.printStackTrace() return } val isOpenTask: Task<IsOpenResponse> = placesClient.isOpen(request) isOpenTask.addOnSuccessListener { response -> val isOpen = response.isOpen } // ...
Java
@NonNull Calendar isOpenCalendar = Calendar.getInstance(); String placeId = "ChIJD3uTd9hx5kcR1IQvGfr8dbk"; IsOpenRequest isOpenRequest; try { isOpenRequest = IsOpenRequest.newInstance(placeId, isOpenCalendar.getTimeInMillis()); } catch (IllegalArgumentException e) { e.printStackTrace(); return; } Task<IsOpenResponse> placeTask = placesClient.isOpen(isOpenRequest); placeTask.addOnSuccessListener( (response) -> isOpen = response.isOpen()); // ...
下一個範例顯示如何呼叫 isOpen()
,並傳遞 Place
物件。Place
物件必須包含有效地點 ID:
Kotlin
val isOpenCalendar: Calendar = Calendar.getInstance() var place: Place val placeId = "ChIJD3uTd9hx5kcR1IQvGfr8dbk" // Specify the required fields for an isOpen request. val placeFields: List<Place.Field> = listOf( Place.Field.BUSINESS_STATUS, Place.Field.CURRENT_OPENING_HOURS, Place.Field.ID, Place.Field.OPENING_HOURS, Place.Field.UTC_OFFSET ) val placeRequest: FetchPlaceRequest = FetchPlaceRequest.newInstance(placeId, placeFields) val placeTask: Task<FetchPlaceResponse> = placesClient.fetchPlace(placeRequest) placeTask.addOnSuccessListener { placeResponse -> place = placeResponse.place val isOpenRequest: IsOpenRequest = try { IsOpenRequest.newInstance(place, isOpenCalendar.timeInMillis) } catch (e: IllegalArgumentException) { e.printStackTrace() return@addOnSuccessListener } val isOpenTask: Task<IsOpenResponse> = placesClient.isOpen(isOpenRequest) isOpenTask.addOnSuccessListener { isOpenResponse -> val isOpen = isOpenResponse.isOpen } // ... } // ...
Java
@NonNull Calendar isOpenCalendar = Calendar.getInstance(); String placeId = "ChIJD3uTd9hx5kcR1IQvGfr8dbk"; // Specify the required fields for an isOpen request. List<Place.Field> placeFields = new ArrayList<>(Arrays.asList( Place.Field.BUSINESS_STATUS, Place.Field.CURRENT_OPENING_HOURS, Place.Field.ID, Place.Field.OPENING_HOURS, Place.Field.UTC_OFFSET )); FetchPlaceRequest request = FetchPlaceRequest.newInstance(placeId, placeFields); Task<FetchPlaceResponse> placeTask = placesClient.fetchPlace(request); placeTask.addOnSuccessListener( (placeResponse) -> { Place place = placeResponse.getPlace(); IsOpenRequest isOpenRequest; try { isOpenRequest = IsOpenRequest.newInstance(place, isOpenCalendar.getTimeInMillis()); } catch (IllegalArgumentException e) { e.printStackTrace(); return; } Task<IsOpenResponse> isOpenTask = placesClient.isOpen(isOpenRequest); isOpenTask.addOnSuccessListener( (isOpenResponse) -> isOpen = isOpenResponse.isOpen()); // ... }); // ...
在應用程式中顯示出處資訊
如果應用程式會顯示地點資訊 (包括地點評論),則也須顯示所有出處資訊。詳情請參閱出處。
進一步瞭解地點 ID
Places SDK for Android 中使用的地點 ID 與 Places API 中使用的 ID 相同。 每個地點 ID 只能參照一個地點,但單一地點可有多個地點 ID。在其他情況下,地點也可能會獲得新的地點 ID。舉例來說,如果商家搬遷到新地點,就可能發生這種情況。
指定地點 ID 要求地點時,您可以放心,回應中一律會是同一個地點 (如果該地點仍存在)。但請注意,回應中可能包含與要求中不同的地點 ID。
詳情請參閱地點 ID 總覽。