בקשה לעדכוני מיקום

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

במדריך הזה תלמדו איך לבקש עדכונים סדירים לגבי המיקום של מכשיר באמצעות השיטה requestLocationUpdates() בספק המיקום המשולב.

קבלת המיקום הידוע האחרון

המיקום הידוע האחרון של המכשיר מספק בסיס שימושי שממנו ניתן ולוודא שהמיקום ידוע של האפליקציה לפני שמפעילים עדכוני מיקום תקופתיים. השיעור בנושא איתור המיקום הידוע האחרון איך לקבל את המיקום הידוע האחרון באמצעות התקשרות getLastLocation(). קטעי הקוד בקטעים הבאים מניחים שהאפליקציה שלכם כבר אחזר את המיקום הידוע האחרון ואחסן אותו אובייקט Location במשתנה הגלובלי mCurrentLocation.

שליחת בקשת מיקום

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

בהתאם לפורמט הבקשה, ספק המיקום הממוזג קורא לשיטת ה-callback‏ LocationCallback.onLocationResult() ומעביר לה רשימה של אובייקטים מסוג Location, או שהוא מנפיק אירוע PendingIntent שמכיל את המיקום בנתונים המורחבים שלו. הדיוק והתדירות של העדכונים מושפעים מהרשאות המיקום שביקשת והאפשרויות שהגדרת באובייקט של בקשת המיקום.

במדריך הזה נסביר איך לקבל את העדכון באמצעות LocationCallback callback. קוראים ל-requestLocationUpdates(), מעבירים לה את המכונה של האובייקט LocationRequest ואת LocationCallback. מגדירים method startLocationUpdates() כפי שמוצג בדוגמת הקוד הבאה:

Kotlin

override fun onResume() {
    super.onResume()
    if (requestingLocationUpdates) startLocationUpdates()
}

private fun startLocationUpdates() {
    fusedLocationClient.requestLocationUpdates(locationRequest,
            locationCallback,
            Looper.getMainLooper())
}

Java

@Override
protected void onResume() {
    super.onResume();
    if (requestingLocationUpdates) {
        startLocationUpdates();
    }
}

private void startLocationUpdates() {
    fusedLocationClient.requestLocationUpdates(locationRequest,
            locationCallback,
            Looper.getMainLooper());
}

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

הגדרת הקריאה החוזרת (callback) של עדכון המיקום

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

Kotlin

private lateinit var locationCallback: LocationCallback

// ...

override fun onCreate(savedInstanceState: Bundle?) {
    // ...

    locationCallback = object : LocationCallback() {
        override fun onLocationResult(locationResult: LocationResult?) {
            locationResult ?: return
            for (location in locationResult.locations){
                // Update UI with location data
                // ...
            }
        }
    }
}

Java

private LocationCallback locationCallback;

// ...

@Override
protected void onCreate(Bundle savedInstanceState) {
    // ...

    locationCallback = new LocationCallback() {
        @Override
        public void onLocationResult(LocationResult locationResult) {
            if (locationResult == null) {
                return;
            }
            for (Location location : locationResult.getLocations()) {
                // Update UI with location data
                // ...
            }
        }
    };
}

הפסקת עדכוני המיקום

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

כדי להפסיק את עדכוני המיקום, צריך לבצע קריאה ל-removeLocationUpdates() ולהעביר לה את הערך LocationCallback, כפי שמתואר בקטע הקוד הבא:

Kotlin

override fun onPause() {
    super.onPause()
    stopLocationUpdates()
}

private fun stopLocationUpdates() {
    fusedLocationClient.removeLocationUpdates(locationCallback)
}

Java

@Override
protected void onPause() {
    super.onPause();
    stopLocationUpdates();
}

private void stopLocationUpdates() {
    fusedLocationClient.removeLocationUpdates(locationCallback);
}

משתמשים במשתנה בוליאני, requestingLocationUpdates, כדי לעקוב אחרי מצב ההפעלה הנוכחי של עדכוני המיקום. בקטע של הפעילות אמצעי תשלום אחד (onResume()), בדיקה האם עדכוני מיקום פעילים כרגע, ומפעילים אותם אם לא:

Kotlin

override fun onResume() {
    super.onResume()
    if (requestingLocationUpdates) startLocationUpdates()
}

Java

@Override
protected void onResume() {
    super.onResume();
    if (requestingLocationUpdates) {
        startLocationUpdates();
    }
}

שמירת המצב של הפעילות

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

דוגמת הקוד הבאה מראה איך להשתמש onSaveInstanceState() קריאה חוזרת (callback) כדי לשמור את מצב המכונה:

Kotlin

override fun onSaveInstanceState(outState: Bundle?) {
    outState?.putBoolean(REQUESTING_LOCATION_UPDATES_KEY, requestingLocationUpdates)
    super.onSaveInstanceState(outState)
}

Java

@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putBoolean(REQUESTING_LOCATION_UPDATES_KEY,
            requestingLocationUpdates);
    // ...
    super.onSaveInstanceState(outState);
}

הגדרה של שיטה updateValuesFromBundle() לשחזור את הערכים השמורים מהמופע הקודם של הפעילות, אם זמינים. קוראים ל-method מה-method‏ onCreate() של הפעילות, כפי שמתואר בדוגמת הקוד הבאה:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    // ...
    updateValuesFromBundle(savedInstanceState)
}

private fun updateValuesFromBundle(savedInstanceState: Bundle?) {
    savedInstanceState ?: return

    // Update the value of requestingLocationUpdates from the Bundle.
    if (savedInstanceState.keySet().contains(REQUESTING_LOCATION_UPDATES_KEY)) {
        requestingLocationUpdates = savedInstanceState.getBoolean(
                REQUESTING_LOCATION_UPDATES_KEY)
    }

    // ...

    // Update UI to match restored state
    updateUI()
}

Java

@Override
public void onCreate(Bundle savedInstanceState) {
    // ...
    updateValuesFromBundle(savedInstanceState);
}

private void updateValuesFromBundle(Bundle savedInstanceState) {
    if (savedInstanceState == null) {
        return;
    }

    // Update the value of requestingLocationUpdates from the Bundle.
    if (savedInstanceState.keySet().contains(REQUESTING_LOCATION_UPDATES_KEY)) {
        requestingLocationUpdates = savedInstanceState.getBoolean(
                REQUESTING_LOCATION_UPDATES_KEY);
    }

    // ...

    // Update UI to match restored state
    updateUI();
}

מידע נוסף על שמירת מצב המכונה זמין במאמר העזרה בנושא הכיתה Android Activity.

הערה: כדי לשמור את ההעדפות של המשתמש באופן עקבי יותר, אפשר לאחסן אותן ב-SharedPreferences של האפליקציה. מגדירים את ההעדפה המשותפת ב-method‏ onPause() של הפעילות, ומאחזרים את ההעדפה ב-onResume(). למידע נוסף על שמירת ההעדפות, קראו את המאמר שמירת קבוצות של מפתחות וערכים.

מקורות מידע נוספים

מידע נוסף זמין במשאבים הבאים:

דוגמיות