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

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

באיור 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:
בתיבת הדו-שיח מופיעות האפשרויות &#39;שינוי למיקום מדויק&#39;, &#39;רק הפעם&#39; ו &#39;דחייה&#39;.
איור 4. המשתמש בחר בעבר באפשרות משוערת ובאפשרות בזמן השימוש באפליקציה (בתיבת הדו-שיח מאיור 3).
בתיבת הדו-שיח מופיעות האפשרויות &#39;רק הפעם&#39; ו&#39;דחייה&#39;.
איור 5. המשתמש בחר בעבר באפשרות משוער ובאפשרות רק הפעם (בתיבת הדו-שיח מאיור 3).

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

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

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

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

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

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

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

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

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

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

Codelabs

סרטונים

טעימות