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

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

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

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

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

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

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

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

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

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

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

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

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

למידע נוסף, אפשר להיעזר במקורות המידע הבאים:

דוגמיות