באמצעות Places SDK ל-Android, אתם יכולים לגלות את המקום במיקום הנוכחי של המכשיר. דוגמאות למקומות: עסקים מקומיים, נקודות עניין ומיקומים גיאוגרפיים.
הרשאות
כדי להשתמש בספרייה, לא צריך להצהיר על הרשאות נוספות במניפסט של האפליקציה, כי הספרייה מצהירה על כל ההרשאות שבהן היא משתמשת במניפסט שלה. עם זאת, אם האפליקציה שלכם משתמשת ב-PlacesClient.findCurrentPlace()
, אתם צריכים לבקש הרשאות גישה למיקום בזמן הריצה.
אם האפליקציה שלך לא משתמשת ב-PlacesClient.findCurrentPlace()
, עליך להסיר באופן מפורש את ההרשאות ACCESS_FINE_LOCATION
ו-ACCESS_COARSE_LOCATION
שנוספו על ידי הספרייה. כדי לעשות זאת, מוסיפים את השורות הבאות למניפסט:
<manifest ... xmlns:tools="http://schemas.android.com/tools"> ... <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" tools:node="remove"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" tools:node="remove"/> ... </manifest>
מידע נוסף על הרשאות ועל EasyPermissions
קבלת המיקום הנוכחי
כדי למצוא את העסק המקומי או מקום אחר שבו המכשיר נמצא כרגע, פועלים לפי השלבים הבאים:
- כדי לבדוק אם המשתמש העניק הרשאה לגישה למיקום המכשיר, קוראים לפונקציה
ContextCompat.checkSelfPermission
. האפליקציה צריכה לכלול גם קוד לבקשת הרשאה מהמשתמש ולטיפול בתוצאה. פרטים נוספים זמינים במאמר בנושא בקשת הרשאות לאפליקציה. - יוצרים
FindCurrentPlaceRequest
, ומעביריםList
שלPlace.Field
s, ומציינים את סוגי נתוני המקום שהאפליקציה צריכה לבקש. - מתקשרים אל
PlacesClient.findCurrentPlace()
ומעבירים אתFindCurrentPlaceRequest
שיצרתם בשלב הקודם. - מקבלים את רשימת
PlaceLikelihood
מ-FindCurrentPlaceResponse
.
השדות תואמים לתוצאות של חיפוש מקומות, והם מחולקים לשלוש קטגוריות לחיוב: בסיסי, פרטי קשר ואווירה. החיוב על שדות בסיסיים הוא לפי התעריף הבסיסי, ולא חלים עליהם חיובים נוספים. החיוב על השדות 'איש קשר' ו'אווירה' הוא גבוה יותר. למידע נוסף על החיוב על בקשות לנתוני מקומות, אפשר לעיין במאמר שימוש וחיוב.
ממשק ה-API מחזיר FindCurrentPlaceResponse
ב-Task
.
התג FindCurrentPlaceResponse
מכיל רשימה של
אובייקטים של PlaceLikelihood
שמייצגים מקומות שבהם המכשיר כנראה נמצא. לכל מקום, התוצאה כוללת אינדיקציה לגבי הסבירות שהמקום הוא המקום הנכון. הרשימה יכולה להיות ריקה אם אין מקום מוכר שמתאים למיקום המכשיר שצוין.
אפשר להתקשר אל PlaceLikelihood.getPlace()
כדי לאחזר אובייקט Place
, ואל PlaceLikelihood.getLikelihood()
כדי לקבל את דירוג הסבירות של המקום. ערך גבוה יותר מציין סבירות גבוהה יותר שהמקום הוא ההתאמה הטובה ביותר.
בדוגמת הקוד הבאה מאחזרים את רשימת המקומות שבהם סביר להניח שהמכשיר נמצא, ומתעדים ביומן את השם והסבירות של כל מקום.
Kotlin
// Use fields to define the data types to return. val placeFields: List<Place.Field> = listOf(Place.Field.NAME) // Use the builder to create a FindCurrentPlaceRequest. val request: FindCurrentPlaceRequest = FindCurrentPlaceRequest.newInstance(placeFields) // Call findCurrentPlace and handle the response (first check that the user has granted permission). if (ContextCompat.checkSelfPermission(this, permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { val placeResponse = placesClient.findCurrentPlace(request) placeResponse.addOnCompleteListener { task -> if (task.isSuccessful) { val response = task.result for (placeLikelihood: PlaceLikelihood in response?.placeLikelihoods ?: emptyList()) { Log.i( TAG, "Place '${placeLikelihood.place.name}' has likelihood: ${placeLikelihood.likelihood}" ) } } else { val exception = task.exception if (exception is ApiException) { Log.e(TAG, "Place not found: ${exception.statusCode}") } } } } else { // A local method to request required permissions; // See https://developer.android.com/training/permissions/requesting getLocationPermission() }
Java
// Use fields to define the data types to return. List<Place.Field> placeFields = Collections.singletonList(Place.Field.NAME); // Use the builder to create a FindCurrentPlaceRequest. FindCurrentPlaceRequest request = FindCurrentPlaceRequest.newInstance(placeFields); // Call findCurrentPlace and handle the response (first check that the user has granted permission). if (ContextCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { Task<FindCurrentPlaceResponse> placeResponse = placesClient.findCurrentPlace(request); placeResponse.addOnCompleteListener(task -> { if (task.isSuccessful()){ FindCurrentPlaceResponse response = task.getResult(); for (PlaceLikelihood placeLikelihood : response.getPlaceLikelihoods()) { Log.i(TAG, String.format("Place '%s' has likelihood: %f", placeLikelihood.getPlace().getName(), placeLikelihood.getLikelihood())); } } else { Exception exception = task.getException(); if (exception instanceof ApiException) { ApiException apiException = (ApiException) exception; Log.e(TAG, "Place not found: " + apiException.getStatusCode()); } } }); } else { // A local method to request required permissions; // See https://developer.android.com/training/permissions/requesting getLocationPermission(); }
הערות לגבי ערכי הסבירות:
- הסבירות מספקת הסתברות יחסית לכך שהמקום הוא ההתאמה הטובה ביותר ברשימת המקומות שהוחזרו לבקשה יחידה. אי אפשר להשוות בין הסבירויות של בקשות שונות.
- ערך הסבירות יהיה בין 0.0 ל-1.0.
לדוגמה, כדי לייצג סיכוי של 55% שהמקום הנכון הוא מקום א', וסיכוי של 35% שהוא מקום ב', התגובה כוללת שני רכיבים: מקום א' עם סיכוי של 0.55 ומקום ב' עם סיכוי של 0.35.
הצגת שיוכים באפליקציה
אם האפליקציה מציגה מידע שהתקבל מ-PlacesClient.findCurrentPlace()
, היא חייבת להציג גם את פרטי השיוך. מידע נוסף זמין במאמר בנושא שיוך.