לפני שאתם מבקשים גישה למיקום בזמן הריצה, כדאי לעיין באפשרויות ובשיטות המומלצות לגישה למיקום ובמדריך לצמצום בקשות ההרשאה. מקורות המידע האלה יעזרו לכם להחליט איזו הרשאה לבקש, ואם הכפתור להרשאת מיקום חד-פעמית הוא חלופה טובה יותר לתרחיש לדוגמה שלכם.
הנחיות לגבי גישה להרשאות מיקום
כמה כללים כלליים שכדאי לפעול לפיהם כשמחליטים איך להטמיע את הגישה למיקום באפליקציה.
גישה למיקום בהקשר
אם תכונה באפליקציה דורשת גישה למיקום, צריך לחכות עד שהמשתמש יבצע פעולה בתכונה לפני ששולחים את בקשת ההרשאה. כך פועלים לפי השיטה המומלצת לבקשת הרשאות בתחילת ההפעלה בהקשר, כפי שמתואר במדריך שמסביר איך לבקש הרשאות שניתנות לאפליקציה.
באיור 1 אפשר לראות איך לבצע את התהליך הזה. באפליקציה יש תכונה של "שיתוף מיקום" שדורשת גישה למיקום בחזית. עם זאת, האפליקציה לא מבקשת הרשאת מיקום עד שהמשתמש לוחץ על הכפתור שיתוף מיקום.
המשתמש יכול לתת הרשאה למיקום משוער בלבד
ב-Android 12 (רמת API 31) ומעלה, המשתמשים יכולים לבקש שהאפליקציה תאחזר רק נתוני מיקום משוער, גם כשהאפליקציה מבקשת את ההרשאה בתחילת ההפעלה ACCESS_FINE_LOCATION.
כדי להתמודד עם התנהגות המשתמשים האפשרית הזו, אל תבקשו את ההרשאה ACCESS_FINE_LOCATION לבדה. במקום זאת, צריך לבקש גם את ההרשאה ACCESS_FINE_LOCATION וגם את ההרשאה ACCESS_COARSE_LOCATION בבקשה אחת בזמן הריצה. אם תנסו לבקש רק את ACCESS_FINE_LOCATION, המערכת תתעלם מהבקשה בחלק מהגרסאות של Android 12. אם האפליקציה מטרגטת את Android מגרסה 12 ואילך, המערכת מתעדת את הודעת השגיאה הבאה ב-Logcat:
ACCESS_FINE_LOCATION must be requested with ACCESS_COARSE_LOCATION.
כשהאפליקציה מבקשת גם את ACCESS_FINE_LOCATION וגם את ACCESS_COARSE_LOCATION, תיבת הדו-שיח של הרשאות המערכת כוללת את האפשרויות הבאות למשתמש:
- מדויק: האפליקציה יכולה לקבל נתוני מיקום מדויקים.
- משוער: האפליקציה יכולה לקבל רק נתוני מיקום משוערים.
באיור 3 אפשר לראות שתיבת הדו-שיח מכילה רמז חזותי לשתי האפשרויות, כדי לעזור למשתמש לבחור. אחרי שהמשתמשים בוחרים את רמת הדיוק של המיקום, הם לוחצים על אחד משלושת הכפתורים כדי לבחור את משך הזמן של ההרשאה.
ב-Android מגרסה 12 ואילך, המשתמשים יכולים להיכנס להגדרות המערכת כדי להגדיר את זיהוי המיקום המשופר המועדף לכל אפליקציה, בלי קשר לגרסת ה-SDK המטורגטת של האפליקציה. זה נכון גם אם האפליקציה מותקנת במכשיר עם Android בגרסה 11 ומטה, והמשתמש משדרג את המכשיר ל-Android בגרסה 12 ומעלה.
ACCESS_COARSE_LOCATION.ACCESS_FINE_LOCATION וגם את ACCESS_COARSE_LOCATION בבקשה אחת בזמן ריצה.
אפשרויות בחירה למשתמשים משפיעות על הענקת ההרשאות
בטבלה הבאה מוצגות ההרשאות שהמערכת מעניקה לאפליקציה, על סמך האפשרויות שהמשתמש בוחר בתיבת הדו-שיח של ההרשאות בתחילת ההפעלה:
| מדויק | משוער | |
|---|---|---|
| בזמן השימוש באפליקציה | ACCESS_FINE_LOCATION ו-ACCESS_COARSE_LOCATION |
ACCESS_COARSE_LOCATION |
| רק הפעם | ACCESS_FINE_LOCATION ו-ACCESS_COARSE_LOCATION |
ACCESS_COARSE_LOCATION |
| דחייה | אין הרשאות מיקום | אין הרשאות מיקום |
כדי לדעת אילו הרשאות המערכת נתנה לאפליקציה, בודקים את הערך המוחזר של בקשת ההרשאות. אתם יכולים להשתמש בספריות של Jetpack בקוד שדומה לקוד הבא, או להשתמש בספריות של הפלטפורמה, שבהן אתם מנהלים את קוד בקשת ההרשאה בעצמכם.
Kotlin
@RequiresApi(Build.VERSION_CODES.N) fun requestPermissions() { val locationPermissionRequest = registerForActivityResult( ActivityResultContracts.RequestMultiplePermissions() ) { permissions -> when { permissions.getOrDefault(Manifest.permission.ACCESS_FINE_LOCATION, false) -> { // Precise location access granted. } permissions.getOrDefault(Manifest.permission.ACCESS_COARSE_LOCATION, false) -> { // Only approximate location access granted. } else -> { // No location access granted. } } } // Before you perform the actual permission request, check whether your app // already has the permissions, and whether your app needs to show a permission // rationale dialog. For more details, see Request permissions: // https://developer.android.com/training/permissions/requesting#request-permission locationPermissionRequest.launch( arrayOf( Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION ) ) }
Java
private void requestPermissions() { ActivityResultLauncher<String[]> locationPermissionRequest = registerForActivityResult(new ActivityResultContracts .RequestMultiplePermissions(), result -> { Boolean fineLocationGranted = null; Boolean coarseLocationGranted = null; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { fineLocationGranted = result.getOrDefault( Manifest.permission.ACCESS_FINE_LOCATION, false); coarseLocationGranted = result.getOrDefault( Manifest.permission.ACCESS_COARSE_LOCATION,false); } if (fineLocationGranted != null && fineLocationGranted) { // Precise location access granted. } else if (coarseLocationGranted != null && coarseLocationGranted) { // Only approximate location access granted. } else { // No location access granted. } } ); // ... // Before you perform the actual permission request, check whether your app // already has the permissions, and whether your app needs to show a permission // rationale dialog. For more details, see Request permissions. locationPermissionRequest.launch(new String[] { Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION }); }
בקשה לשדרוג למיקום מדויק
אתם יכולים לבקש מהמשתמש לשדרג את הגישה של האפליקציה ממיקום משוער למיקום מדויק. לפני שאתם מבקשים מהמשתמש לשדרג את הגישה של האפליקציה למיקום המדויק, כדאי לבדוק אם תרחיש השימוש של האפליקציה באמת דורש רמת דיוק כזו. אם האפליקציה צריכה להתאים מכשיר למכשירים בקרבת מקום באמצעות Bluetooth או Wi-Fi, כדאי להשתמש בהתאמת מכשירים נלווים או בהרשאות Bluetooth, במקום לבקש את ההרשאה ACCESS_FINE_LOCATION.
כדי לבקש מהמשתמש לשדרג את הגישה של האפליקציה למיקום, ממיקום משוער למיקום מדויק, צריך לבצע את הפעולות הבאות:
- אם צריך, מסבירים למה האפליקציה זקוקה להרשאה.
- מבקשים שוב את ההרשאות
ACCESS_FINE_LOCATIONו-ACCESS_COARSE_LOCATIONביחד. המשתמש כבר אישר למערכת להעניק לאפליקציה גישה למיקום משוער, ולכן תיבת הדו-שיח של המערכת שונה הפעם, כמו שמוצג באיור 4 ובאיור 5:
בהתחלה, בקשו רק את המיקום בחזית
גם אם כמה תכונות באפליקציה דורשות גישה למיקום, סביר להניח שרק חלק מהן דורשות גישה למיקום ברקע. לכן, מומלץ שהאפליקציה תבצע בקשות מצטברות להרשאות מיקום, ותבקש גישה למיקום בחזית ואז גישה למיקום ברקע. כשמבצעים בקשות הדרגתיות, המשתמשים מקבלים יותר שליטה ושקיפות כי הם יכולים להבין טוב יותר אילו תכונות באפליקציה צריכות גישה למיקום ברקע.
באיור 6 מוצגת דוגמה לאפליקציה שמיועדת לטפל בבקשות מצטברות. כדי להשתמש בתכונות "הצגת המיקום הנוכחי" ו "המלצה על מקומות בסביבה", צריך לתת לאפליקציה גישה למיקום כשהיא פועלת בחזית. עם זאת, רק התכונה "המלצה על מקומות בסביבה" דורשת גישה למיקום ברקע.
כך מבצעים בקשות מצטברות:
בהתחלה, האפליקציה צריכה להנחות את המשתמשים לתכונות שדורשות גישה למיקום בחזית, כמו התכונה "שיתוף מיקום" באיור 1 או התכונה "הצגת המיקום הנוכחי" באיור 2.
מומלץ להשבית את הגישה של המשתמשים לתכונות שדורשות גישה למיקום ברקע עד שלאפליקציה תהיה גישה למיקום בחזית.
בשלב מאוחר יותר, כשהמשתמש יבדוק תכונות שדורשות גישה למיקום ברקע, תוכלו לבקש גישה למיקום ברקע.
מקורות מידע נוספים
למידע נוסף על הרשאות מיקום ב-Android, אפשר לעיין במקורות המידע הבאים:
Codelabs
סרטונים
דוגמאות
- אפליקציה לדוגמה שמדגימה את השימוש בהרשאות מיקום.