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