אם האפליקציה צריכה לבקש מיקום או לקבל עדכוני הרשאות, צריך להפעיל במכשיר את הגדרות המערכת המתאימות, כמו סריקה של GPS או Wi-Fi. במקום להפעיל באופן ישיר שירותים כמו ה-GPS של המכשיר, האפליקציה מציינת את רמת הדיוק או צריכת האנרגיה הנדרשת ואת מרווח הזמן הרצוי לעדכון, והמכשיר מבצע באופן אוטומטי את השינויים המתאימים בהגדרות המערכת. ההגדרות האלה מוגדרות על ידי אובייקט הנתונים LocationRequest
.
במדריך הזה תלמדו איך להשתמש בלקוח ההגדרות כדי לבדוק אילו הגדרות מופעלות, ולהציג את תיבת הדו-שיח של הגדרות המיקום כדי שהמשתמשים יוכלו לעדכן את ההגדרות בלחיצה אחת.
הגדרת שירותי המיקום
כדי להשתמש בשירותי המיקום שסופקו על ידי Google Play Services וספק המיקום המשולב, צריך לחבר את האפליקציה באמצעות הלקוח של ההגדרות, לבדוק את הגדרות המיקום הנוכחיות ולהנחות את המשתמש להפעיל את ההגדרות הנדרשות, אם צריך.
אפליקציות שהתכונות שלהן משתמשות בשירותי המיקום צריכות לבקש הרשאות מיקום, בהתאם לתרחישי השימוש של התכונות האלה.
הגדרת בקשת מיקום
כדי לאחסן פרמטרים לבקשות לספק המיקום המשולב, יוצרים LocationRequest
.
הפרמטרים קובעים את רמת הדיוק של בקשות המיקום. פרטים על כל האפשרויות הזמינות לבקשות מיקום זמינים במאמר העזרה בנושא המחלקה LocationRequest
. בשיעור הזה מגדירים את מרווח הזמן לעדכון, את מרווח הזמן המהיר ביותר לעדכון ואת העדיפות, כפי שמתואר בהמשך:
- מרווח העדכון
-
setInterval()
- השיטה הזו קובעת את התדירות באלפיות השנייה שבה האפליקציה מעדיפה לקבל עדכוני מיקום. לתשומת ליבכם: עדכוני המיקום עשויים להתבצע מהר יותר או לאט יותר מהקצב הזה כדי לבצע אופטימיזציה של השימוש בסוללה, או שלא יתבצעו עדכונים בכלל (לדוגמה, אם אין חיבור למכשיר). - מרווח העדכון המהיר ביותר
-
setFastestInterval()
- השיטה הזו מגדירה את הקצב המהיר באלפיות השנייה שבו האפליקציה יכולה לטפל בעדכוני מיקום. אין צורך להפעיל את השיטה הזו אלא אם האפליקציה שלכם נהנית מקבלת עדכונים מהר יותר מהקצב שצוין ב-setInterval()
. - עדיפות
-
setPriority()
- השיטה הזו קובעת את העדיפות של הבקשה, ומספקת לשירותי המיקום של Google Play Services רמז חזק לגבי מקורות המיקום שבהם כדאי להשתמש. הערכים הבאים נתמכים:-
PRIORITY_BALANCED_POWER_ACCURACY
- ההגדרה הזו משמשת לבקשת רמת דיוק של המיקום ברמת הרחוב, כלומר דיוק של כ-100 מטרים. זוהי רמת דיוק גסה, וסביר להניח שהיא צורכת פחות חשמל. בהגדרה הזו, סביר להניח ששירותי המיקום ישתמשו במיקום לפי רשתות Wi-Fi ומגדלי תקשורת. עם זאת, חשוב לזכור שהבחירה של ספק המיקום תלויה בגורמים רבים אחרים, כמו המקורות שזמינים. -
PRIORITY_HIGH_ACCURACY
- משתמשים בהגדרה הזו כדי לבקש את המיקום המדויק ביותר האפשרי. כשההגדרה הזו מופעלת, יש סיכוי גבוה יותר ששירותי המיקום ישתמשו ב-GPS כדי לקבוע את המיקום. PRIORITY_LOW_POWER
- משתמשים בהגדרה הזו כדי לבקש דיוק ברמת העיר, כלומר דיוק של כ-10 קילומטרים. זוהי רמת דיוק גסה, וסביר להניח שהיא צורכת פחות חשמל.PRIORITY_NO_POWER
- השתמשו בהגדרה הזו אם אתם רוצים לקבל עדכוני מיקום כשהם זמינים, אבל לא רוצים להשפיע באופן משמעותי על צריכת החשמל. בהגדרה הזו, האפליקציה לא מפעילה עדכוני מיקום, אבל היא מקבלת מיקומים שהופעלו על ידי אפליקציות אחרות.
-
יוצרים את בקשת המיקום ומגדירים את הפרמטרים כפי שמתואר בקטע הקוד לדוגמה:
Kotlin
fun createLocationRequest() { val locationRequest = LocationRequest.Builder() .setIntervalMillis(10000) .setFastestIntervalMillis(5000) .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) .build() }
Java
protected void createLocationRequest() { LocationRequest locationRequest = LocationRequest.Builder() .setIntervalMillis(10000) .setFastestIntervalMillis(5000) .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) .build(); }
העדיפות של PRIORITY_HIGH_ACCURACY
, בשילוב עם הגדרת ההרשאה ACCESS_FINE_LOCATION
שהגדרתם במניפסט של האפליקציה ופרק הזמן המהיר של העדכון (5,000 אלפיות שנייה, או 5 שניות), גורמים לספק המיקום המשולב להחזיר עדכוני מיקום מדויקים ברמת דיוק של כמה מטרים.
הגישה הזו מתאימה לאפליקציות מפות שמציגות את המיקום בזמן אמת.
טיפ לשיפור הביצועים: אם האפליקציה שלכם ניגשת לרשת או מבצעת פעולות ממושכות אחרות אחרי קבלת עדכון מיקום, כדאי לשנות את מרווח הזמן המהיר ביותר לערך איטי יותר. ההתאמה הזו מונעת מהאפליקציה לקבל עדכונים שהיא לא יכולה להשתמש בהם. אחרי שהעבודה הארוכה מסתיימת, צריך להגדיר את מרווח הזמן המהיר ביותר חזרה לערך מהיר.
אחזור של הגדרות המיקום הנוכחיות
אחרי שמתחברים ל-Google Play Services ול-API של שירותי המיקום, אפשר לקבל את הגדרות המיקום הנוכחיות של המכשיר של המשתמש. כדי לעשות זאת, יוצרים LocationSettingsRequest.Builder
ומוסיפים בקשה אחת או יותר לקבלת מיקום. בקטע הקוד הבא מוסבר איך להוסיף את בקשת המיקום שנוצרה בשלב הקודם:
Kotlin
val builder = LocationSettingsRequest.Builder() .addLocationRequest(locationRequest)
Java
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder() .addLocationRequest(locationRequest);
בשלב הבא, בודקים אם הגדרות המיקום הנוכחיות עומדות בדרישות:
Kotlin
val builder = LocationSettingsRequest.Builder() // ... val client: SettingsClient = LocationServices.getSettingsClient(this) val task: Task<LocationSettingsResponse> = client.checkLocationSettings(builder.build())
Java
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder(); // ... SettingsClient client = LocationServices.getSettingsClient(this); Task<LocationSettingsResponse> task = client.checkLocationSettings(builder.build());
בסיום הקריאה של Task
, האפליקציה יכולה לבדוק את הגדרות המיקום על ידי בדיקת קוד הסטטוס מהאובייקט LocationSettingsResponse
. כדי לקבל פרטים נוספים על המצב הנוכחי של הגדרות המיקום הרלוונטיות, האפליקציה יכולה להפעיל את השיטה getLocationSettingsStates()
של האובייקט LocationSettingsResponse
.
בקשה מהמשתמש לשנות את הגדרות המיקום
כדי לקבוע אם הגדרות המיקום מתאימות לבקשת המיקום, מוסיפים את
OnFailureListener
לאובייקט
Task
שמאמת את הגדרות המיקום. לאחר מכן, צריך לבדוק אם האובייקט
Exception
שהוענק לשיטה
onFailure()
הוא מופע של הכיתה
ResolvableApiException
, מה שמציין שצריך לשנות את ההגדרות. לאחר מכן, קוראים ל-
startResolutionForResult()
כדי להציג תיבת דו-שיח שבה המשתמש מתבקש להעניק הרשאה לשינוי הגדרות המיקום.
קטע הקוד הבא מראה איך לקבוע אם הגדרות המיקום של המשתמש מאפשרות לשירותי המיקום ליצור
LocationRequest
, ואיך לבקש מהמשתמש הרשאה לשנות את הגדרות המיקום במקרה הצורך:
Kotlin
task.addOnSuccessListener { locationSettingsResponse -> // All location settings are satisfied. The client can initialize // location requests here. // ... } task.addOnFailureListener { exception -> if (exception is ResolvableApiException){ // Location settings are not satisfied, but this can be fixed // by showing the user a dialog. try { // Show the dialog by calling startResolutionForResult(), // and check the result in onActivityResult(). exception.startResolutionForResult(this@MainActivity, REQUEST_CHECK_SETTINGS) } catch (sendEx: IntentSender.SendIntentException) { // Ignore the error. } } }
Java
task.addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() { @Override public void onSuccess(LocationSettingsResponse locationSettingsResponse) { // All location settings are satisfied. The client can initialize // location requests here. // ... } }); task.addOnFailureListener(this, new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { if (e instanceof ResolvableApiException) { // Location settings are not satisfied, but this can be fixed // by showing the user a dialog. try { // Show the dialog by calling startResolutionForResult(), // and check the result in onActivityResult(). ResolvableApiException resolvable = (ResolvableApiException) e; resolvable.startResolutionForResult(MainActivity.this, REQUEST_CHECK_SETTINGS); } catch (IntentSender.SendIntentException sendEx) { // Ignore the error. } } } });
בשיעור הבא, קבלת עדכוני מיקום, תלמדו איך לקבל עדכוני מיקום תקופתיים.