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

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

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

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

סוגי גישה למיקום

כל הרשאה כוללת שילוב של המאפיינים הבאים:

מיקום בחזית

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

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

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

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

    בנוסף, מומלץ להצהיר על שירות שפועל בחזית סוג של 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>

מיקום ברקע

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

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

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

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

אחרי שהמשתמש בוחר בלחצן &#39;שיתוף מיקום&#39;,
    מופיעה תיבת דו-שיח עם הרשאת מיקום במערכת
איור 1. תכונת שיתוף מיקום שדורשת גישה למיקום בחזית. התכונה מופעלת אם המשתמש בוחר רק כשהאפליקציה בשימוש.

המשתמש יכול להקצות רק מיקום משוער

ב-Android 12 (רמת API 31) ואילך, המשתמשים יכולים לבקש שהאפליקציה תאחזר רק פרטי מיקום משוער, גם כשהאפליקציה מבקשת ACCESS_FINE_LOCATION הרשאה בתחילת ההפעלה.

כדי לטפל בהתנהגות הפוטנציאלית הזו של משתמשים, אין לבקש את ACCESS_FINE_LOCATION כשלעצמה. במקום זאת, צריך לבקש גם את ACCESS_FINE_LOCATION ואת ההרשאה ACCESS_COARSE_LOCATION הרשאה בבקשה אחת של סביבת זמן ריצה. אם מנסים רק לבקש ACCESS_FINE_LOCATION, המערכת מתעלמת מהבקשה בחלק מהגרסאות של Android 12. אם האפליקציה מטרגטת את Android 12 או את Android גבוהה יותר, המערכת רושמת את הודעת השגיאה הבאה 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 בלבד.
בתיבת הדו-שיח יש שתי קבוצות של אפשרויות, אחת מעל השנייה
איור 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

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.
locationPermissionRequest.launch(arrayOf(
    Manifest.permission.ACCESS_FINE_LOCATION,
    Manifest.permission.ACCESS_COARSE_LOCATION))

Java

ActivityResultLauncher<String[]> locationPermissionRequest =
    registerForActivityResult(new ActivityResultContracts
        .RequestMultiplePermissions(), result -> {
            Boolean fineLocationGranted = result.getOrDefault(
                    Manifest.permission.ACCESS_FINE_LOCATION, false);
            Boolean 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 figure 5:
תיבת הדו-שיח מכילה את האפשרויות &#39;שינוי למדויקת
         location&#39;, &#39;Only this time&#39; (רק הפעם) ו-&#39;Deny&#39; (דחייה).
איור 4. המשתמש הקודם נבחרו האפשרויות אומדן ובעת השימוש באפליקציה (בתיבת הדו-שיח מאיור 3).
תיבת הדו-שיח מכילה את האפשרויות &#39;רק הפעם&#39;. וגם
         &#39;דחייה&#39;.
איור 5. המשתמש הקודם נבחרו אומדן ורק הפעם (בתיבת הדו-שיח איור 3).

בקשת מיקום בחזית בלבד

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

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

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

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

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

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

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

בקשת מיקום ברקע במקרה הצורך

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

התוכן של תיבת הדו-שיח להרשאה תלוי בגרסת היעד של ה-SDK

כשתכונה באפליקציה מבקשת מיקום ברקע במכשיר שפועל Android 10 (רמת API 29), תיבת הדו-שיח להרשאות המערכת כוללת אפשרות שנקרא מותר כל הזמן. אם המשתמש יבחר באפשרות הזו, התכונה האפליקציה מקבלת גישה למיקום ברקע.

עם זאת, ב-Android מגרסה 11 (רמת API 30) ואילך, תיבת הדו-שיח של המערכת כוללים את האפשרות מותר, כל הזמן. במקום זאת, המשתמשים צריכים להפעיל רקע את המיקום בדף הגדרות, כפי שמוצג באיור 7.

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

האפליקציה מטרגטת ל-Android מגרסה 11 ואילך

אם האפליקציה שלך לא קיבלה את ההרשאה ACCESS_BACKGROUND_LOCATION, וגם shouldShowRequestPermissionRationale() מחזירה true, מציגים למשתמשים ממשק משתמש חינוכי שכולל:

  • הסבר ברור למה נדרשת גישה לפיצ'ר של האפליקציה ברקע המיקום.
  • התווית הגלויה למשתמש של אפשרות ההגדרות שמעניקה מיקום ברקע (לדוגמה, מותר, כל הזמן באיור 7). אפשר להתקשר getBackgroundPermissionOptionLabel() כדי לקבל את התווית הזו. הערך המוחזר בשיטה הזו מותאם לשוק המקומי העדפת שפה במכשיר.
  • למשתמשים יש אפשרות לדחות את ההרשאה. אם המשתמשים מסרבים לפעולה ברקע גישה למיקום, אמורה להיות לו אפשרות להמשיך להשתמש באפליקציה שלך.
המשתמשים יכולים להקיש על התראת המערכת כדי לשנות מיקום
  הגדרות של אפליקציה
איור 8. התראה שמזכירה למשתמש שהוא העניק הרשאת גישה למיקום ברקע של אפליקציה.

האפליקציה מטרגטת ל-Android מגרסה 10 ומטה

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

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

המשתמש יכול להשפיע על רמת הדיוק של המיקום ברקע

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

תזכורת על הרשאת מיקום ברקע

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

בודקים אם יש דרישות מיקום ביחסי התלות של ה-SDK של האפליקציה

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

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

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

שיעורי Lab

סרטונים

דוגמיות