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

אם האפליקציה צריכה לבקש מיקום או לקבל עדכונים להרשאות, המכשיר צריך להפעיל את הגדרות המערכת המתאימות, כמו GPS או Wi-Fi בסריקה. במקום להפעיל באופן ישיר שירותים כמו ה-GPS של המכשיר, האפליקציה מציינת את הרמה הנדרשת של דיוק/צריכת חשמל, וגם את פרק הזמן הרצוי לעדכון, והמכשיר קובע אוטומטית שינויים בהגדרות המערכת. הגדרות אלה נקבעות על ידי LocationRequest של אובייקט נתונים.

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

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

כדי להשתמש בשירותי המיקום שמסופקים על ידי Google Play Services ספק המיקום המשולב, מחברים את האפליקציה באמצעות לקוח הגדרות, לבדוק את הגדרות המיקום הנוכחיות ולבקש מהמשתמש להפעיל את בהגדרות הנדרשות לפי הצורך.

אפליקציות שהתכונות שלהן משתמשות בשירותי מיקום לבקש הרשאות מיקום, בהתאם לתרחישים לדוגמה של התכונות האלה.

הגדרה של בקשת מיקום

כדי לאחסן פרמטרים של בקשות לספק המיקום המשולב, יוצרים LocationRequest הפרמטרים קובעים את רמת הדיוק של בקשות המיקום. עבור לפרטים על כל האפשרויות הזמינות לבקשת מיקום, קראו את LocationRequest הפניה לכיתה. השיעור הזה מגדיר את מרווח הזמן לעדכון, העדכון המהיר ביותר והעדיפות, כפי שמתואר בהמשך:

עדכון מרווח זמן
setInterval() - השיטה הזו מגדירה את הקצב באלפיות השנייה שבו האפליקציה מעדיפה לקבל עדכוני מיקום. שים לב שעדכוני המיקום עשויים להיות במידה מסוימת מהיר או איטי יותר מהקצב הזה כדי לבצע אופטימיזציה לשימוש בסוללה, או שיהיו לא יהיו עדכונים בכלל (למשל, אם למכשיר אין קישוריות).
המרווח הכי מהיר לעדכון
setFastestInterval() - השיטה הזו מגדירה את התעריף המהיר ביותר באלפיות השנייה כ- האפליקציה יכולה לטפל בעדכוני מיקום. אלא אם יש עבור האפליקציה יתרונות קבלת עדכונים מהר יותר מהקצב שצוין setInterval(), אין צורך לקרוא לשיטה הזו.
עדיפות

setPriority() - השיטה הזו קובעת את עדיפות הבקשה, שמעניקה ל-Google Play שירותי המיקום של השירותים האלה הם רמז ברור לגבי מקורות המיקום שבהם כדאי להשתמש. הערכים הבאים נתמכים:

  • 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 לאובייקט. כדי לקבל עוד פרטים על המצב הנוכחי של הגדרות המיקום, האפליקציה יכולה לקרוא LocationSettingsResponse של האובייקט getLocationSettingsStates() .

הצגת בקשה למשתמש לשנות את הגדרות המיקום

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

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