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

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

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