יש כמה דרכים לבקש את נתוני המיקום של המשתמשים ב-Android, והדרך הכי טובה משתנה בהתאם לתרחיש שימוש. במדריך הזה מתוארים תרחישים שונים של גישה למיקום, ומוסבר איך לבקש הרשאות מיקום בכל מקרה.
כדי להתחיל, כדאי לעיין בשיטות המומלצות לכל ההרשאות בתחילת ההפעלה ובהנחיות הכלליות יותר בנושא צמצום בקשות ההרשאה.
סוגי הגישה למיקום
לכל הרשאה יש שילוב של המאפיינים הבאים:
- קטגוריה: מיקום בחזית או מיקום ברקע.
- דיוק: מיקום מדויק או מיקום משוער.
מיקום בחזית
אם האפליקציה שלכם כוללת תכונה שמשתפת או מקבלת נתוני מיקום רק פעם אחת, או למשך פרק זמן מוגדר, התכונה הזו דורשת גישה למיקום בחזית. הנה כמה דוגמאות:
- באפליקציית ניווט, תכונה שמאפשרת למשתמשים לקבל מסלול מפורט.
- באפליקציית הודעות, תכונה שמאפשרת למשתמשים לשתף את המיקום הנוכחי שלהם עם משתמש אחר.
המערכת מחשיבה את האפליקציה ככזו שמשתמשת במיקום בחזית אם תכונה באפליקציה ניגשת למיקום הנוכחי של המכשיר באחד מהמצבים הבאים:
- פעילות ששייכת לאפליקציה שלכם גלויה.
האפליקציה שלך מפעילה שירות שפועל בחזית. כשהשירות פועל בחזית, המערכת מציגה התראה קבועה כדי שהמשתמשים יהיו מודעים לכך. האפליקציה שומרת על הגישה כשהיא מועברת לרקע, למשל כשהמשתמש לוחץ על כפתור דף הבית במכשיר או מכבה את המסך של המכשיר.
בנוסף, צריך להצהיר על סוג שירות שפועל בחזית של
location, כמו שמוצג בקטע הקוד הבא. ב-Android בגרסה 10 (רמת API 29) ומעלה, צריך להצהיר על הסוג הזה של שירות שפועל בחזית.<!-- Recommended for Android 9 (API level 28) and lower. --> <!-- Required for Android 10 (API level 29) and higher. --> <service android:name="MyNavigationService" android:foregroundServiceType="location" ... > <!-- Any inner elements would go here. --> </service>
כדי להצהיר על צורך במיקום בחזית, האפליקציה צריכה לבקש את ההרשאה ACCESS_COARSE_LOCATION או את ההרשאה ACCESS_FINE_LOCATION, כמו שמוצג בקטע הקוד הבא:
<manifest ... >
<!-- Always include this permission -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- Include only if your app benefits from precise location access. -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
</manifest>
גישה חד-פעמית בנוסף לגישה לנתוני המיקום בחזית, בחלק מתרחישי השימוש יש הבחנה נוספת: נדרשת גישה למיקום של המשתמש רק בנקודות ספציפיות בחוויית השימוש באפליקציה, בניגוד לעדכון עקבי לאורך כל השימוש באפליקציה. במקרים כאלה, האפליקציות צריכות להשתמש בכפתור להרשאת מיקום חד-פעמית כדי לבקש גישה למיקום בסשן הספציפי הזה של השימוש באפליקציה. בנוסף, אם האפליקציה שלכם מטרגטת את Android 17 (רמת API 37) ואילך, והיא מכילה רק תכונות שדורשות גישה למיקום לפי סשן, דרישות המדיניות של Google Play מחייבות אתכם להשתמש בכפתור להרשאת מיקום חד-פעמית. פרטים נוספים זמינים במדיניות בנושא כפתור להרשאת מיקום חד פעמית.
מיקום ברקע
אפליקציה דורשת גישה למיקום ברקע אם תכונה בתוך האפליקציה משתפת את המיקום עם משתמשים אחרים באופן קבוע או משתמשת ב-Geofencing API. הנה כמה דוגמאות:
- באפליקציה לשיתוף מיקום עם בני משפחה, יש תכונה שמאפשרת למשתמשים לשתף את המיקום שלהם עם בני המשפחה באופן רציף.
- באפליקציית IoT, תכונה מאפשרת למשתמשים להגדיר את המכשירים הביתיים שלהם כך שהם יכבו כשהמשתמשים יוצאים מהבית ויופעלו כשהם חוזרים הביתה.
המערכת מחשיבה את האפליקציה ככזו שמשתמשת במיקום ברקע אם היא ניגשת למיקום הנוכחי של המכשיר בכל מצב אחר מלבד אלה שמתוארים בסעיף מיקום בחזית. רמת הדיוק של המיקום ברקע זהה לרמת הדיוק של המיקום בחזית, והיא תלויה בהרשאות המיקום שהאפליקציה מצהירה עליהן.
ב-Android מגרסה 10 (רמת API 29) ומעלה, צריך להצהיר על ההרשאה ACCESS_BACKGROUND_LOCATION במניפסט של האפליקציה כדי לבקש גישה למיקום ברקע בזמן הריצה. בגרסאות קודמות של Android, כשהאפליקציה מקבלת גישה למיקום בחזית, היא מקבלת באופן אוטומטי גם גישה למיקום ברקע.
<manifest ... >
<!-- Required only when requesting background location access on
Android 10 (API level 29) and higher. -->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
</manifest>
דיוק
ב-Android יש תמיכה ברמות הבאות של דיוק המיקום:
- משוער
- מספק הערכה של מיקום המכשיר. אם הערכת המיקום הזו מגיעה מ-
LocationManagerServiceאו מ-FusedLocationProvider, היא מדויקת בטווח של כ-3 קילומטרים רבועים. האפליקציה יכולה לקבל מיקומים ברמת הדיוק הזו כשמצהירים על ההרשאהACCESS_COARSE_LOCATIONאבל לא על ההרשאהACCESS_FINE_LOCATION. - מדויק
- הערכת מיקום המכשיר בצורה הכי מדויקת שאפשר.
אם המיקום המשוער מבוסס על
LocationManagerServiceאו עלFusedLocationProvider, הוא בדרך כלל מדויק עד לטווח של כ-50 מטרים, ולפעמים אפילו עד לטווח של כמה מטרים או פחות. האפליקציה יכולה לקבל מיקומים ברמת הדיוק הזו כשמצהירים על ההרשאהACCESS_FINE_LOCATION.
אם המשתמש נותן הרשאת מיקום משוער, לאפליקציה יש גישה רק למיקום המשוער, בלי קשר להרשאות המיקום שהאפליקציה מצהירה עליהן.
האפליקציה צריכה לפעול גם כשהמשתמש נותן גישה רק למיקום משוער. אם תכונה באפליקציה מחייבת גישה למיקום המדויק באמצעות ההרשאה ACCESS_FINE_LOCATION, אתם יכולים לבקש מהמשתמש לאפשר לאפליקציה לגשת למיקום המדויק.
תזכורת לגבי הרשאת מיקום ברקע
ב-Android בגרסה 10 (רמת API 29) ומעלה, בפעם הראשונה שתכונה באפליקציה ניגשת למיקום המכשיר ברקע אחרי שהמשתמש נותן גישה למיקום ברקע, המערכת מתזמנת שליחה של התראה למשתמש. ההתראה הזו מזכירה למשתמש שהוא נתן לאפליקציה הרשאה לגשת למיקום של המכשיר כל הזמן. דוגמה להתראה מופיעה באיור 8.
איך בודקים אם יש דרישות לגבי מיקומים בתלויות של ערכת ה-SDK של האפליקציה
בודקים אם באפליקציה נעשה שימוש בערכות SDK שתלויות בהרשאות מיקום, במיוחד בהרשאה ACCESS_FINE_LOCATION. בפוסט Getting to know the behaviors of your SDK dependencies בבלוג Medium מפורט מידע נוסף.
מקורות מידע נוספים
למידע נוסף על הרשאות מיקום ב-Android, אפשר לעיין במקורות המידע הבאים:
Codelabs
סרטונים
דוגמאות
- אפליקציה לדוגמה שמדגימה את השימוש בהרשאות מיקום.