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