ניהול כל הקבצים במכשיר אחסון

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

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

שליחת בקשה לגישה לכל הקבצים

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

  1. מצהירים על ההרשאה MANAGE_EXTERNAL_STORAGE במניפסט.
  2. משתמשים בפעולת הכוונה ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION כדי להפנות את המשתמשים לדף הגדרות המערכת שבו הם יכולים להפעיל את האפשרות הבאה לאפליקציה: הרשאת גישה לניהול כל הקבצים.

כדי לבדוק אם לאפליקציה שלכם הוענקה ההרשאה MANAGE_EXTERNAL_STORAGE, קוראים לפונקציה Environment.isExternalStorageManager().

פעולות שמותר לבצע באמצעות MANAGE_EXTERNAL_STORAGE

ההרשאה MANAGE_EXTERNAL_STORAGE מעניקה את האפשרויות הבאות:

  • הרשאת קריאה וכתיבה לכל הקבצים באחסון שיתופי.

  • גישה לתוכן הטבלה MediaStore.Files.

  • גישה לספריית השורש של כונן ה-USB לנייד (OTG) ושל כרטיס ה-SD.

  • הרשאת כתיבה לכל ספריות האחסון הפנימיות, מלבד /Android/data/, ‏ /sdcard/Android ורוב ספריות המשנה של /sdcard/Android. גישת הכתיבה הזו כוללת גישה לנתיב קובץ ישיר.

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

כשאפליקציה מקבלת את ההרשאה MANAGE_EXTERNAL_STORAGE, היא יכולה לגשת לקבצים ולספריות הנוספים האלה באמצעות ה-API של MediaStore או באמצעות נתיבי קבצים ישירים. עם זאת, כשמשתמשים ב-Storage Access Framework, אפשר לגשת לקובץ או לספרייה רק אם אפשר לעשות זאת בלי ההרשאה MANAGE_EXTERNAL_STORAGE.

הפעלת פעילות ניהול האחסון של אפליקציה אחרת

ב-Android מגרסה 12 ואילך (רמת API 31 ואילך), אפליקציות שיש להן גם את ההרשאה MANAGE_EXTERNAL_STORAGE וגם את ההרשאה QUERY_ALL_PACKAGES – כמו אפליקציות לניהול קבצים – יכולות להשתמש ב-getManageSpaceActivityIntent() כדי לשלוח משתמשים לפעילות ניהול מרחב משותף בהתאמה אישית של אפליקציה אחרת.

השיטה getManageSpaceActivityIntent() מקבלת שם של חבילת קוד וקוד בקשה, ומחזירה אחד מהערכים הבאים:

  • PendingIntent, אם באפליקציה עם שם החבילה שצוין מוגדרת פעילות בהתאמה אישית של 'ניהול מרחב'. לאחר מכן, אפליקציית ניהול הקבצים שהפעילה את השיטה getManageSpaceActivityIntent() יכולה להפעיל את ה-Intent שהוחזר כדי לשלוח משתמשים לפעילות בהתאמה אישית.
  • null, אם לא מוגדרת באפליקציה עם שם החבילה שצוין פעילות 'ניהול מרחב משותף'.

הפעלת MANAGE_EXTERNAL_STORAGE לצורך בדיקה

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

adb shell appops set --uid PACKAGE_NAME MANAGE_EXTERNAL_STORAGE allow

הודעה מ-Google Play

בקטע הזה מופיעה הודעה למפתחים שמפרסמים אפליקציות ב-Google Play.

כדי להגביל את הגישה הרחבה לאחסון המשותף, עדכנו את המדיניות של חנות Google Play כדי לבדוק אפליקציות שמטרגטות את Android 11 (רמת API 30) ומעלה ומבקשות גישה לכל הקבצים באמצעות ההרשאה MANAGE_EXTERNAL_STORAGE. המדיניות הזו נכנסה לתוקף במאי 2021.

כשהאפליקציה מטרגטת את Android 11 ואילך ומצהירה על ההרשאה MANAGE_EXTERNAL_STORAGE, מוצגת ב-Android Studio אזהרת איתור שגיאות בקוד שמופיעה באיור 1. האזהרה הזו מזכירה לכם שלחנות Google Play יש מדיניות שמגבילה את השימוש בהרשאה.

איור 1. אזהרה של Lint ב-Android Studio שמזכירה למפתחים את המדיניות של Google Play בנושא ההרשאה MANAGE_EXTERNAL_STORAGE.

מבקשים את ההרשאה MANAGE_EXTERNAL_STORAGE רק כשהאפליקציה לא יכולה להשתמש ביעילות בממשקי API ידידותיים יותר לפרטיות, כמו Storage Access Framework או Media Store API. השימוש של האפליקציה בהרשאה צריך להתאים לשימושים המותרים, והוא חייב להיות קשור ישירות לפונקציונליות העיקרית של האפליקציה. אם האפליקציה כוללת תרחיש לדוגמה שדומה לאחד מהתרחישים הבאים, סביר להניח שהיא יכולה לבקש את ההרשאה MANAGE_EXTERNAL_STORAGE:

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