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

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

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