בקשת גישה למיקום בזמן הריצה

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

הנחיות לגישה להרשאות מיקום

בהמשך מפורטות כמה הנחיות כלליות שיעזרו לכם להחליט איך להטמיע באפליקציה גישה למיקום.

גישה למיקום בהקשר

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

איור 1 מציג את התהליך הזה. האפליקציה מכילה תכונה של 'שיתוף מיקום' שנדרשת לה גישה למיקום בחזית. האפליקציה לא מבקשת הרשאת גישה למיקום עד שהמשתמש לוחץ על הלחצן שיתוף מיקום.

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

תיבת הדו-שיח מתייחסת רק למיקום משוער וכוללת 3 לחצנים, אחד מעל השני
איור 2. תיבת דו-שיח של הרשאות המערכת שמופיעה כשהאפליקציה מבקשת ACCESS_COARSE_LOCATION בלבד
.
בתיבת הדו-שיח יש 2 קבוצות של אפשרויות, אחת מעל השנייה
איור 3. תיבת דו-שיח של הרשאות המערכת שמופיעה כשהאפליקציה מבקשת את ההרשאות 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.

כדי לבקש מהמשתמש לשדרג את הגישה למיקום של האפליקציה ממיקום משוער למיקום מדויק, צריך לבצע את הפעולות הבאות:

  1. במקרה הצורך, עליך להסביר למה האפליקציה שלך זקוקה להרשאה.
  2. צריך לבקש שוב את ההרשאות ACCESS_FINE_LOCATION ו-ACCESS_COARSE_LOCATION. המשתמש כבר אישר למערכת להעניק לאפליקציה את המיקום המשוער, ולכן תיבת הדו-שיח של המערכת שונה הפעם, כמו שמוצג באיור 4 ובאיור 5:
בתיבת הדו-שיח מופיעות האפשרויות 'שינוי למיקום מדויק', 'רק הפעם' ו 'דחייה'.
איור 4. המשתמש בחר בעבר באפשרות משוערת ובאפשרות בזמן השימוש באפליקציה (בתיבת הדו-שיח מאיור 3).
תיבת הדו-שיח מכילה את האפשרויות 'רק הפעם' ו'דחייה'.
איור 5. המשתמש בחר בעבר באפשרות משוער ובאפשרות רק הפעם (בתיבת הדו-שיח מאיור 3).

לבקש בהתחלה רק מיקום בחזית

גם אם כמה תכונות באפליקציה דורשות גישה למיקום, סביר להניח שרק חלק מהן דורשות גישה למיקום ברקע. לכן, מומלץ שהאפליקציה שלך תבצע בקשות מצטברות להרשאות מיקום, כלומר תבקש גישה למיקום בחזית ואז גישה למיקום ברקע. כשמבצעים בקשות מצטברות, המשתמשים מקבלים יותר שליטה ושקיפות כי הם יכולים להבין טוב יותר אילו תכונות באפליקציה שלכם צריכות גישה למיקום ברקע.

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

הכפתור שמאפשר גישה למיקום בחזית ממוקם במרחק של חצי מסך מהכפתור שמאפשר גישה למיקום ברקע
איור 6. לשתיהן נדרשת גישה למיקום, אבל רק לתכונה 'המלצות לתכונות בסביבה' נדרשת גישה למיקום ברקע.

כך מבצעים בקשות מצטברות:

  1. בתחילה, האפליקציה צריכה להפנות את המשתמשים לתכונות שנדרשת עבורן גישה למיקום בחזית, כמו התכונה 'שיתוף מיקום' באיור 1 או התכונה 'הצגת המיקום הנוכחי' באיור 2.

    מומלץ להשבית את הגישה של המשתמשים לתכונות שדורשות גישה למיקום ברקע עד שהאפליקציה מקבלת גישה למיקום בחזית.

  2. בשלב מאוחר יותר, כשהמשתמש ינסה להשתמש בתכונות שמחייבות גישה למיקום ברקע, תוכלו לבקש גישה למיקום ברקע.

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

מידע נוסף על הרשאות מיקום ב-Android זמין במקורות הבאים:

Codelabs

סרטונים

דוגמאות