עדכונים בנושא הרשאות ב-Android {7/}11

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

הרשאות חד-פעמיות

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

מידע נוסף על האופן שבו המערכת מטפלת בהרשאות חד-פעמיות

איפוס אוטומטי של הרשאות לאפליקציות שלא בשימוש

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

מידע נוסף על איפוס אוטומטי של הרשאות באפליקציות שלא בשימוש

הצגת תיבת הדו-שיח של ההרשאות

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

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

adb shell dumpsys package PACKAGE_NAME

כאשר PACKAGE_NAME הוא שם החבילה שרוצים לבדוק.

הפלט של הפקודה מכיל קטעים שנראים כך:

...
runtime permissions:
  android.permission.POST_NOTIFICATIONS: granted=false, flags=[ USER_SENSITIVE_WHEN_GRANTED|USER_SENSITIVE_WHEN_DENIED]
  android.permission.ACCESS_FINE_LOCATION: granted=false, flags=[ USER_SET|USER_FIXED|USER_SENSITIVE_WHEN_GRANTED|USER_SENSITIVE_WHEN_DENIED]
  android.permission.BLUETOOTH_CONNECT: granted=false, flags=[ USER_SENSITIVE_WHEN_GRANTED|USER_SENSITIVE_WHEN_DENIED]
...

הרשאות שהמשתמש דחה פעם אחת מסומנות על ידי USER_SET. הרשאות שנדחו באופן סופי על ידי בחירה באפשרות דחייה פעמיים מסומנות בסמל USER_FIXED.

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

adb shell pm clear-permission-flags PACKAGE_NAME PERMISSION_NAME user-set user-fixed

‫PERMISSION_NAME הוא שם ההרשאה שרוצים לאפס. כדי לראות רשימה מלאה של ההרשאות שניתנות לאפליקציות ל-Android, אפשר להיכנס לדף העזרה של ה-API בנושא הרשאות.

איך מטפלים בדחיית הרשאות באפליקציה

שינויים בחלון ההתראות של המערכת

ב-Android 11 יש כמה שינויים באופן שבו אפליקציות מקבלות את ההרשאה SYSTEM_ALERT_WINDOW. השינויים נועדו להגן על המשתמשים על ידי הפיכת מתן ההרשאה לפעולה מכוונת יותר.

אפליקציות מסוימות מקבלות את ההרשאה SYSTEM_ALERT_WINDOW באופן אוטומטי לפי בקשה

סוגים מסוימים של אפליקציות מקבלים את ההרשאה SYSTEM_ALERT_WINDOW באופן אוטומטי לפי בקשה:

  • כל אפליקציה שיש לה את ROLE_CALL_SCREENING ומבקשת את SYSTEM_ALERT_WINDOW מקבלת את ההרשאה באופן אוטומטי. אם האפליקציה מאבדת את ROLE_CALL_SCREENING, היא מאבדת את ההרשאה.

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

האפליקציות האלה לא צריכות לשלוח את ACTION_MANAGE_OVERLAY_PERMISSION כדי לקבל את ההרשאה SYSTEM_ALERT_WINDOW. הן יכולות פשוט לבקש את SYSTEM_ALERT_WINDOW באופן ישיר.

ה-intent של MANAGE_OVERLAY_PERMISSION תמיד מעביר את המשתמש למסך הרשאות המערכת

החל מ-Android 11, ACTION_MANAGE_OVERLAY_PERMISSION Intent תמיד מעביר את המשתמש למסך ההגדרות ברמה העליונה, שבו המשתמש יכול לתת או לבטל את ההרשאות SYSTEM_ALERT_WINDOW לאפליקציות. המערכת מתעלמת מכל נתוני package: ב-Intent.

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

מספרי טלפון

ב-Android 11 יש שינוי בהרשאה שקשורה לטלפון, שבה האפליקציה משתמשת כשהיא קוראת מספרי טלפון.

אם האפליקציה מטרגטת ל-Android 11 ואילך וצריכה לגשת לממשקי ה-API של מספרי הטלפון שמופיעים ברשימה הבאה, צריך לבקש את ההרשאה READ_PHONE_NUMBERS במקום ההרשאה READ_PHONE_STATE.

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

  1. משנים את ההצהרה של READ_PHONE_STATE כך שהאפליקציה תשתמש בהרשאה רק ב-Android 10 (רמת API‏ 29) ומטה.
  2. מוסיפים את ההרשאה READ_PHONE_NUMBERS.

בקטע הקוד הבא של הצהרת המניפסט אפשר לראות את התהליך הזה:

<manifest>
    <!-- Grants the READ_PHONE_STATE permission only on devices that run
         Android 10 (API level 29) and lower. -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE"
                     android:maxSdkVersion="29" />
    <uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />
</manifest>

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

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

סרטונים

פיתוח עם השינויים האחרונים בתחום הפרטיות ב-Android 11