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