Places SDK สำหรับ Android (เดิม) ให้ข้อมูลที่สมบูรณ์เกี่ยวกับสถานที่แก่แอปของคุณ ซึ่งรวมถึงชื่อและที่อยู่ของสถานที่ ตำแหน่งทางภูมิศาสตร์ที่ระบุเป็นพิกัดละติจูด/ลองจิจูด ประเภทของสถานที่ (เช่น ไนต์คลับ ร้านขายสัตว์เลี้ยง พิพิธภัณฑ์) และอื่นๆ หากต้องการเข้าถึงข้อมูลนี้สำหรับสถานที่ที่เฉพาะเจาะจง คุณสามารถใช้รหัสสถานที่ ซึ่งเป็นตัวระบุที่คงที่ซึ่งระบุสถานที่หนึ่งๆ โดยไม่ซ้ำกัน
รายละเอียดสถานที่
ออบเจ็กต์ Place ให้ข้อมูลเกี่ยวกับสถานที่ที่เจาะจง คุณสามารถรับออบเจ็กต์ Place ได้โดยเรียกใช้ PlacesClient.fetchPlace() ดูคำแนะนำเกี่ยวกับการรับสถานที่ตามรหัส
เมื่อขอสถานที่ คุณต้องระบุข้อมูลสถานที่ที่จะแสดงผล โดยส่งรายการค่า Place.Field ที่ระบุข้อมูลที่จะแสดงผล รายการนี้เป็นข้อพิจารณาที่สำคัญเนื่องจากส่งผลต่อค่าใช้จ่ายสำหรับคำขอแต่ละรายการ
เนื่องจากผลลัพธ์ข้อมูลสถานที่ต้องไม่ว่างเปล่า ระบบจึงแสดงเฉพาะผลลัพธ์สถานที่ที่มีข้อมูลเท่านั้น ตัวอย่างเช่น หากสถานที่ที่ขอไม่มีรูปภาพ ช่อง photos จะไม่แสดงในผลลัพธ์
ตัวอย่างต่อไปนี้จะส่งรายการค่า Place.Field 3 ค่าเพื่อระบุข้อมูลที่คำขอแสดงผล
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 เมธอดที่เกี่ยวข้องจะแสดงผลเป็น Null ตัวอย่างวิธีการบางส่วนที่ใช้ได้มีดังนี้
getAddress()– ที่อยู่ของสถานที่ในรูปแบบที่มนุษย์อ่านได้getAddressComponents()–Listของคอมโพเนนต์ที่อยู่สำหรับสถานที่นี้ คอมโพเนนต์เหล่านี้มีไว้เพื่อวัตถุประสงค์ในการดึงข้อมูลที่มีโครงสร้างเกี่ยวกับที่อยู่ของสถานที่ เช่น การค้นหาเมืองที่สถานที่ตั้งอยู่ อย่าใช้คอมโพเนนต์เหล่านี้ในการจัดรูปแบบที่อยู่ แต่ให้เรียกใช้getAddress()ซึ่งจะแสดงที่อยู่ซึ่งจัดรูปแบบตามภาษาท้องถิ่นgetId()– ตัวระบุที่เป็นข้อความสำหรับสถานที่ อ่านข้อมูลเพิ่มเติมเกี่ยวกับรหัสสถานที่ได้ในส่วนที่เหลือของหน้านี้getLatLng()– สถานที่ตั้งทางภูมิศาสตร์ของสถานที่ ซึ่งระบุเป็นพิกัดละติจูดและลองจิจูดgetName()– ชื่อสถานที่getOpeningHours()–OpeningHoursของสถานที่ เรียกใช้OpeningHours.getWeekdayText()เพื่อแสดงผลรายการสตริงที่แสดงเวลาเปิดและปิดสำหรับแต่ละวันในสัปดาห์ เรียกใช้OpeningHours.getPeriods()เพื่อแสดงรายการออบเจ็กต์periodที่มีข้อมูลโดยละเอียดเพิ่มเติมซึ่งเทียบเท่ากับข้อมูลที่ได้จากgetWeekdayText()ออบเจ็กต์
PlaceยังมีเมธอดgetCurrentOpeningHours()ซึ่งแสดงเวลาทำการของสถานที่ในช่วง 7 วันข้างหน้า และgetSecondaryOpeningHours()ซึ่งแสดงเวลาทำการรองของสถานที่ในช่วง 7 วันข้างหน้าisOpen()– บูลีนที่ระบุว่าสถานที่นั้นเปิดอยู่หรือไม่ หากไม่ได้ระบุเวลา ค่าเริ่มต้นจะเป็นเวลาปัจจุบัน ระบบจะแสดงผลisOpenก็ต่อเมื่อมีทั้งPlace.Field.UTC_OFFSETและPlace.Field.OPENING_HOURSโปรดขอช่องPlace.Field.BUSINESS_STATUSและPlace.Field.UTC_OFFSETในคำขอสถานที่เดิมเพื่อให้ได้ผลลัพธ์ที่ถูกต้อง หากไม่ได้ขอ ระบบจะถือว่าธุรกิจเปิดดำเนินการอยู่ ดูวิธีใช้isOpenกับรายละเอียดสถานที่ได้ในวิดีโอนี้
ตัวอย่างมีดังต่อไปนี้
Kotlin
val name = place.displayName val address = place.formattedAddress val location = place.location
Java
final CharSequence name = place.getDisplayName(); final CharSequence address = place.getFormattedAddress(); final LatLng location = place.getLocation();
ดูสถานที่ตามรหัส
รหัสสถานที่เป็นตัวระบุข้อความที่ระบุสถานที่โดยไม่ซ้ำกัน ใน Places SDK สำหรับ Android คุณสามารถดึงรหัสของสถานที่ได้โดยเรียกใช้ Place.getId()
บริการPlace Autocompleteยังแสดงรหัสสถานที่สำหรับสถานที่แต่ละแห่งที่ตรงกับคำค้นหาและตัวกรองที่ระบุด้วย คุณสามารถจัดเก็บรหัสสถานที่และใช้เพื่อดึงข้อมูลออบเจ็กต์ Place อีกครั้งในภายหลังได้
หากต้องการดูสถานที่ตามรหัส ให้เรียกใช้ PlacesClient.fetchPlace() โดยส่ง FetchPlaceRequest
API จะแสดงผล FetchPlaceResponse ใน Task
FetchPlaceResponse มีออบเจ็กต์ Place ที่ตรงกับรหัสสถานที่ที่ระบุ
ตัวอย่างโค้ดต่อไปนี้แสดงการเรียกใช้ fetchPlace() เพื่อดูรายละเอียดของสถานที่ที่ระบุ
Kotlin
// Define a Place ID. val placeId = PlaceIdProvider.getRandomPlaceId() // Specify the fields to return. val placeFields = listOf( Place.Field.ID, Place.Field.DISPLAY_NAME, Place.Field.FORMATTED_ADDRESS, Place.Field.LOCATION, ) // 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 val name = place.displayName val address = place.formattedAddress val location = place.location binding.placeName.text = name binding.placeAddress.text = address if (location != null) { binding.placeLocation.text = getString( R.string.place_location, location.latitude, location.longitude, ) } else { binding.placeLocation.text = null } Log.i(TAG, "Place found: ${place.displayName}") }.addOnFailureListener { exception: Exception -> if (exception is ApiException) { val message = getString(R.string.place_not_found, exception.message) binding.placeName.text = message 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 = PlaceIdProvider.getRandomPlaceId(); // Specify the fields to return. final List<Place.Field> placeFields = Arrays.asList( Place.Field.ID, Place.Field.DISPLAY_NAME, Place.Field.FORMATTED_ADDRESS, Place.Field.LOCATION); // 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(); final CharSequence name = place.getDisplayName(); final CharSequence address = place.getFormattedAddress(); final LatLng location = place.getLocation(); binding.placeName.setText(name); binding.placeAddress.setText(address); if (location != null) { binding.placeLocation.setText( getString( R.string.place_location, location.latitude, location.longitude)); } else { binding.placeLocation.setText(null); } Log.i(TAG, "Place found: " + place.getDisplayName()); }) .addOnFailureListener( (exception) -> { if (exception instanceof ApiException apiException) { final String message = getString( R.string.place_not_found, apiException.getMessage()); binding.placeName.setText(message); 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หรือสตริงที่ระบุรหัสสถานที่ - ค่าเวลาที่ไม่บังคับซึ่งระบุเวลาเป็นมิลลิวินาทีตั้งแต่ 1970-01-01T00:00:00Z หากไม่ได้ระบุเวลา ค่าเริ่มต้นจะเป็นเวลาปัจจุบัน
วิธีนี้กำหนดให้ต้องมีช่องต่อไปนี้ในออบเจ็กต์ Place
Place.Field.BUSINESS_STATUSPlace.Field.CURRENT_OPENING_HOURSPlace.Field.OPENING_HOURSPlace.Field.UTC_OFFSET
หากไม่มีช่องเหล่านี้ในออบเจ็กต์ Place หรือหากคุณส่งรหัสสถานที่ เมธอดจะใช้ PlacesClient.fetchPlace() เพื่อดึงข้อมูล ดูข้อมูลเพิ่มเติมเกี่ยวกับการสร้างออบเจ็กต์ Place ที่มีช่องที่จำเป็นได้ที่รายละเอียดสถานที่
ตัวอย่างต่อไปนี้จะระบุว่าสถานที่เปิดอยู่หรือไม่ในขณะนี้ ในตัวอย่างนี้ คุณจะส่งเฉพาะรหัสสถานที่ไปยัง isOpen():
Kotlin
val isOpenCalendar: Calendar = Calendar.getInstance() val placeId = PlaceIdProvider.getRandomPlaceId() val request: IsOpenRequest = try { IsOpenRequest.newInstance(placeId, isOpenCalendar.timeInMillis) } catch (e: IllegalArgumentException) { Log.e("PlaceIsOpen", "Error: " + e.message) return } val isOpenTask: Task<IsOpenResponse> = placesClient.isOpen(request) isOpenTask.addOnSuccessListener { response -> val isOpen = response.isOpen ?: false binding.isOpenByIdResult.text = getString(R.string.is_open_by_id, isOpen.toString()) Log.d("PlaceIsOpen", "Is open by ID: $isOpen") } // ...
Java
@NonNull Calendar isOpenCalendar = Calendar.getInstance(); String placeId = PlaceIdProvider.getRandomPlaceId(); IsOpenRequest isOpenRequest; try { isOpenRequest = IsOpenRequest.newInstance(placeId, isOpenCalendar.getTimeInMillis()); } catch (IllegalArgumentException e) { Log.e("PlaceIsOpen", "Error: " + e.getMessage()); return; } Task<IsOpenResponse> placeTask = placesClient.isOpen(isOpenRequest); placeTask.addOnSuccessListener( (response) -> { final boolean isOpen = Boolean.TRUE.equals(response.isOpen()); binding.isOpenByIdResult.setText( getString(R.string.is_open_by_id, String.valueOf(isOpen))); Log.d("PlaceIsOpen", "Is open by ID: " + isOpen); }); placeTask.addOnFailureListener( (exception) -> { binding.isOpenByIdResult.setText( getString(R.string.is_open_by_id, "Error: " + exception.getMessage())); Log.e("PlaceIsOpen", "Error: " + exception.getMessage()); });
ตัวอย่างถัดไปแสดงการเรียก isOpen() โดยที่คุณส่งออบเจ็กต์ Place
ออบเจ็กต์ Place ต้องมีรหัสสถานที่ที่ถูกต้อง ดังนี้
Kotlin
val isOpenCalendar: Calendar = Calendar.getInstance() var place: Place val placeId = PlaceIdProvider.getRandomPlaceId() // 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.DISPLAY_NAME, ) 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) { Log.e("PlaceIsOpen", "Error: " + e.message) return@addOnSuccessListener } val isOpenTask: Task<IsOpenResponse> = placesClient.isOpen(isOpenRequest) isOpenTask.addOnSuccessListener { isOpenResponse -> val isOpen = when (isOpenResponse.isOpen) { true -> getString(R.string.is_open) else -> getString(R.string.is_closed) } binding.isOpenByObjectResult.text = getString( R.string.is_open_by_object, place.displayName, isOpen, ) Log.d("PlaceIsOpen", "Is open by object: $isOpen") } // ... } // ...
Java
@NonNull Calendar isOpenCalendar = Calendar.getInstance(); String placeId = PlaceIdProvider.getRandomPlaceId(); // 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.DISPLAY_NAME)); 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) { Log.e("PlaceIsOpen", "Error: " + e.getMessage()); return; } Task<IsOpenResponse> isOpenTask = placesClient.isOpen(isOpenRequest); isOpenTask.addOnSuccessListener( (isOpenResponse) -> { final boolean isOpen = Boolean.TRUE.equals(isOpenResponse.isOpen()); binding.isOpenByObjectResult.setText( getString( R.string.is_open_by_object, place.getDisplayName(), String.valueOf(isOpen))); Log.d("PlaceIsOpen", "Is open by object: " + isOpen); }); isOpenTask.addOnFailureListener( (exception) -> { // also update the result text field binding.isOpenByObjectResult.setText( getString( R.string.is_open_by_object, place.getDisplayName(), "Error: " + exception.getMessage())); Log.e("PlaceIsOpen", "Error: " + exception.getMessage()); }); }); placeTask.addOnFailureListener( (exception) -> { binding.isOpenByObjectResult.setText("Error: " + exception.getMessage()); Log.e("PlaceIsOpen", "Error: " + exception.getMessage());
แสดงการระบุแหล่งที่มาในแอป
เมื่อแอปแสดงข้อมูลสถานที่ รวมถึงรีวิวสถานที่ แอปต้องแสดงการระบุแหล่งที่มาด้วย ดูข้อมูลเพิ่มเติมได้ที่การระบุแหล่งที่มา
ข้อมูลเพิ่มเติมเกี่ยวกับรหัสสถานที่
รหัสสถานที่ที่ใช้ใน Places SDK สำหรับ Android (เดิม) เป็นตัวระบุเดียวกับที่ใช้ใน Places API (เดิม) รหัสสถานที่แต่ละรหัสจะอ้างอิงถึงสถานที่ได้เพียงแห่งเดียว แต่สถานที่แห่งเดียวอาจมีรหัสสถานที่ได้มากกว่า 1 รหัส ยังมีสถานการณ์อื่นๆ ที่อาจทำให้สถานที่ได้รับรหัสสถานที่ใหม่ ตัวอย่างเช่น กรณีนี้อาจเกิดขึ้นหากธุรกิจย้ายไปยังสถานที่ตั้งใหม่
เมื่อขอสถานที่โดยระบุรหัสสถานที่ คุณมั่นใจได้ว่าจะได้รับสถานที่เดียวกันในการตอบกลับเสมอ (หากสถานที่นั้นยังคงอยู่) อย่างไรก็ตาม โปรดทราบว่าการตอบกลับอาจมีรหัสสถานที่ที่แตกต่างจากรหัสในคำขอของคุณ
ดูข้อมูลเพิ่มเติมได้ที่ภาพรวมรหัสสถานที่