Places SDK برای Android اطلاعات غنی درباره مکانها، از جمله نام و آدرس مکان، موقعیت جغرافیایی مشخص شده به عنوان مختصات طول و عرض جغرافیایی، نوع مکان (مانند کلوپ شبانه، فروشگاه حیوانات خانگی، موزه) و غیره را در اختیار برنامه شما قرار میدهد. برای دسترسی به این اطلاعات برای یک مکان خاص، می توانید از شناسه مکان استفاده کنید، یک شناسه پایدار که به طور منحصر به فرد مکان را شناسایی می کند.
جزئیات مکان
شی Place اطلاعاتی در مورد یک مکان خاص ارائه می دهد. میتوانید با فراخوانی PlacesClient.fetchPlace() شیء Place را در دست بگیرید – راهنمای دریافت مکان با شناسه را ببینید.
هنگامی که درخواست مکانی می کنید، باید مشخص کنید که کدام داده مکان را برگردانید. برای انجام این کار، لیستی از مقادیر Place.Field را ارسال کنید که دادههای مورد نظر را مشخص میکند. این لیست یک ملاحظه مهم است زیرا بر هزینه هر درخواست تأثیر می گذارد.
از آنجایی که نتایج دادههای مکان نمیتوانند خالی باشند، فقط نتایج مکان با داده برگردانده میشوند. به عنوان مثال، اگر مکان درخواستی بدون عکس باشد، فیلد photos در نتیجه وجود نخواهد داشت.
مثال زیر فهرستی از سه مقدار Place.Field را برای مشخص کردن دادههای بازگردانده شده توسط یک درخواست ارسال میکند:
کاتلین
// Specify the fields to return. val placeFields = listOf(Place.Field.DISPLAY_NAME, Place.Field.RATING)
جاوا
// Specify the fields to return. final List<Place.Field> placeFields = Arrays.asList(Place.Field.DISPLAY_NAME, Place.Field.RATING);
به فیلدهای داده شی مکان دسترسی پیدا کنید
پس از به دست آوردن شیء Place ، از متدهای شی برای دسترسی به فیلدهای داده مشخص شده در درخواست استفاده کنید. اگر فیلد در شیء Place وجود نداشته باشد، متد مربوطه null را برمیگرداند. در زیر نمونه هایی از چند روش موجود نشان داده شده است.
-
getAddress()– آدرس مکان، در قالب قابل خواندن توسط انسان. -
getAddressComponents()–Listاز اجزای آدرس برای این مکان. این اجزا به منظور استخراج اطلاعات ساختاریافته در مورد آدرس یک مکان، به عنوان مثال یافتن شهری که یک مکان در آن قرار دارد، ارائه شده است. از این مؤلفهها برای قالببندی آدرس استفاده نکنید. در عوض،getAddress()را فراخوانی کنید، که یک آدرس فرمت شده محلی را ارائه می دهد. -
getId()– شناسه متنی مکان. در ادامه این صفحه درباره شناسه مکان ها بیشتر بخوانید. -
getLatLng()– موقعیت جغرافیایی مکان، مشخص شده به عنوان مختصات طول و عرض جغرافیایی. -
getName()– نام مکان. getOpeningHours()–OpeningHoursمکان. باOpeningHours.getWeekdayText()تماس بگیرید تا لیستی از رشته هایی که ساعات باز و بسته شدن هر روز هفته را نشان می دهد، برگردانید.OpeningHours.getPeriods()را فراخوانی کنید تا لیستی از اشیاءperiodرا با اطلاعات دقیق تری که معادل داده های ارائه شده توسطgetWeekdayText()است، برگردانید.شی
Placeهمچنین حاوی متدgetCurrentOpeningHours()است که ساعات کار یک مکان را در هفت روز آینده برمی گرداند وgetSecondaryOpeningHours()که ساعات ثانویه کار یک مکان را در هفت روز آینده برمی گرداند.isOpen()- یک بولی که نشان می دهد آیا مکان در حال حاضر باز است یا خیر. اگر زمان مشخص نشده باشد، پیش فرض اکنون است.isOpenفقط در صورتی برگردانده می شود که هر دوPlace.Field.UTC_OFFSETوPlace.Field.OPENING_HOURSموجود باشند. برای اطمینان از نتایج دقیق، فیلدهایPlace.Field.BUSINESS_STATUSوPlace.Field.UTC_OFFSETرا در درخواست مکان اصلی خود درخواست کنید. در صورت عدم درخواست، فرض بر این است که کسب و کار عملیاتی است. برای نحوه استفاده ازisOpenبا جزئیات مکان، این ویدیو را ببینید.
چند نمونه:
کاتلین
val name = place.displayName val address = place.formattedAddress val location = place.location
جاوا
final CharSequence name = place.getDisplayName(); final CharSequence address = place.getFormattedAddress(); final LatLng location = place.getLocation();
با شناسه مکان بگیرید
شناسه مکان یک شناسه متنی است که به طور منحصر به فرد مکان را شناسایی می کند. در Places SDK برای Android، میتوانید شناسه یک مکان را با فراخوانی Place.getId() بازیابی کنید. سرویس تکمیل خودکار مکان همچنین برای هر مکان یک شناسه مکان برمیگرداند که با عبارت جستجو و فیلتر ارائه شده مطابقت دارد. میتوانید شناسه مکان را ذخیره کنید و بعداً از آن برای بازیابی مجدد شیء Place استفاده کنید.
برای دریافت مکان با شناسه، با ارسال یک FetchPlaceRequest PlacesClient.fetchPlace() تماس بگیرید.
API یک FetchPlaceResponse در یک Task برمی گرداند. FetchPlaceResponse حاوی یک شی Place است که با شناسه مکان ارائه شده مطابقت دارد.
مثال کد زیر فراخوانی fetchPlace() را برای دریافت جزئیات مکان مشخص شده نشان می دهد.
کاتلین
// 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") } }
جاوا
// 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_STATUS -
Place.Field.CURRENT_OPENING_HOURS -
Place.Field.OPENING_HOURS -
Place.Field.UTC_OFFSET
اگر این فیلدها در شی Place ارائه نشده باشند، یا اگر یک شناسه مکان را ارسال کنید، متد از PlacesClient.fetchPlace() برای واکشی آنها استفاده می کند. برای اطلاعات بیشتر در مورد ایجاد شی Place با فیلدهای لازم، جزئیات مکان را ببینید.
مثال زیر تعیین می کند که آیا مکانی در حال حاضر باز است یا خیر. در این مثال، شما فقط شناسه مکان را به isOpen() میدهید:
کاتلین
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") } // ...
جاوا
@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 باید دارای شناسه مکان معتبر باشد:
کاتلین
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") } // ... } // ...
جاوا
@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 است. هر شناسه مکان می تواند تنها به یک مکان اشاره داشته باشد، اما یک مکان واحد می تواند بیش از یک شناسه مکان داشته باشد. شرایط دیگری وجود دارد که ممکن است باعث شود یک مکان شناسه مکان جدیدی دریافت کند. برای مثال، اگر یک کسب و کار به مکان جدیدی نقل مکان کند، ممکن است این اتفاق بیفتد.
هنگامی که با تعیین شناسه مکان درخواست مکانی می کنید، می توانید مطمئن باشید که همیشه همان مکان را در پاسخ دریافت خواهید کرد (اگر مکان هنوز وجود دارد). با این حال، توجه داشته باشید که پاسخ ممکن است حاوی شناسه مکانی متفاوت از شناسه درخواست شما باشد.
برای اطلاعات بیشتر، نمای کلی شناسه مکان را ببینید.