SDK של מקומות ל-Android מספק לאפליקציה מידע עשיר על מקומות, כולל השם והכתובת של המקום, המיקום הגיאוגרפי שצוין כקואורדינטות של קווי אורך ורוחב, סוג המקום (כמו מועדון לילה, חנות חיות מחמד, מוזיאון) ועוד. כדי לגשת למידע הזה לגבי מקום ספציפי, יש לך אפשרות להשתמש במזהה המקום, שהוא מזהה קבוע שמזהה מקום באופן ייחודי.
פרטי המקום
האובייקט
Place
מספק מידע על מקום ספציפי. אפשר לשמור אובייקט
Place
בדרכים הבאות:
- התקשרות
PlacesClient.findCurrentPlace()
– כדאי לעיין במדריך לאיתור המקום הנוכחי. - התקשרות אל
PlacesClient.fetchPlace()
– המדריך למציאת מקום לפי מזהה.
כשאתם מבקשים מקום, עליכם לציין אילו נתוני מקום להחזיר. כדי לעשות זאת, צריך להעביר רשימה של ערכי Place.Field שמציינים את הנתונים שיש להחזיר. הרשימה הזו חשובה מאוד כי היא משפיעה על העלות של כל בקשה.
מאחר שתוצאות של נתוני מקום לא יכולות להיות ריקות, רק תוצאות של מקום עם נתונים מוחזרות (לדוגמה, אם למקום מסוים אין תמונות, השדה photos
לא יופיע בתוצאה).
הדוגמה הבאה מעבירה רשימה של שלושה ערכי Place.Field כדי לציין את הנתונים שמוחזרים על ידי בקשה:
Java
// Specify the fields to return. final ListplaceFields = Arrays.asList(Place.Field.NAME, Place.Field.RATING, Place.Field.OPENING_HOURS);
Kotlin
// Specify the fields to return. val placeFields = listOf(Place.Field.NAME, Place.Field.RATING, Place.Field.OPENING_HOURS)
אחרי שמקבלים את האובייקט Place
, משתמשים בשיטות של האובייקט כדי לגשת לשדות הנתונים שצוינו בבקשה. אם השדה חסר באובייקט Place
, השיטה הקשורה תחזיר את הערך null. בהמשך ריכזנו כמה דוגמאות לכמה מהשיטות הזמינות.
לרשימה המלאה של כל השיטות, קראו את Place
ממשק ה-API.
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
עם פרטי המקום.
כמה דוגמאות פשוטות:
Java
final CharSequence name = place.getName(); final CharSequence address = place.getAddress(); final LatLng location = place.getLatLng();
Kotlin
val name = place.name val address = place.address val location = place.latLng
מציאת מקום לפי מזהה
מזהה מקום הוא מזהה טקסט שמאפשר לזהות מקום באופן ייחודי. ב-SDK של מקומות ל-Android אפשר לאחזר את המזהה של מקום על ידי קריאה אל Place.getId()
.
השירות
השלמה אוטומטית של מקומות
מחזיר גם מזהה מקום לכל מקום שתואם לשאילתת החיפוש ולמסנן שסופקו. אפשר לשמור את מזהה המקום ולהשתמש בו כדי לאחזר את האובייקט Place
שוב מאוחר יותר.
כדי לקבל מקום לפי מזהה, יש להתקשר למספר PlacesClient.fetchPlace()
ולעבור FetchPlaceRequest
.
ה-API יחזיר
FetchPlaceResponse
ב-
Task
.
FetchPlaceResponse
מכיל אובייקט Place
שתואם למזהה המקום שסופק.
באמצעות דוגמת הקוד הבאה מוצגת קריאה ל-fetchPlace()
לקבלת פרטים על המקום שצוין.
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. } });
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") } }
קבלת סטטוס פתוח
השיטה 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()
:
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()); // ...
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 } // ...
בדוגמה הבאה מוצגת קריאה ל-isOpen()
כשעוברים אובייקט Place
.
האובייקט Place
חייב להכיל מזהה מקום תקין:
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()); // ... }); // ...
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 } // ... } // ...
הצגת ייחוסים באפליקציה
כשהאפליקציה מציגה מידע על מקומות, האפליקציה צריכה להציג גם שיוכים. תוכלו להיעזר במסמכי התיעוד בנושא שיוך (Attribution).
מידע נוסף על מזהי מקומות
מזהה המקום המשמש ב-SDK של מקומות ל-Android הוא אותו מזהה שמופיע ב-API של Google Places. כל מזהה של מקום יכול להפנות רק למקום אחד, אבל לכל מקום יכול להיות יותר ממזהה אחד של מקום. יש נסיבות אחרות שעשויות לגרום למקום לקבל מזהה מקום חדש. לדוגמה, מצב כזה יכול לקרות אם עסק עובר למיקום חדש.
כשאתם מבקשים מקום על ידי ציון מזהה של מקום, אתם יכולים להיות בטוחים שתמיד תקבלו את אותו מקום בתגובה (אם המקום עדיין קיים). עם זאת, ייתכן שהתשובה מכילה מזהה מקום שונה מזה שמופיע בבקשה שלך.
מידע נוסף זמין במאמר סקירה כללית על מזהה מקום.