שינוי הגדרות המיקום

אם האפליקציה צריכה לבקש מיקום או לקבל עדכוני הרשאות, צריך להפעיל במכשיר את הגדרות המערכת המתאימות, כמו סריקה של 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.
            }
        }
    }
});

בשיעור הבא, קבלת עדכוני מיקום, תלמדו איך לקבל עדכוני מיקום תקופתיים.