اندروید 11 (سطح API 30) پلتفرم را بیشتر بهبود می بخشد و از داده های برنامه و کاربر در حافظه خارجی محافظت می کند. این نسخه چندین پیشرفت را معرفی می کند، مانند دسترسی به مسیر فایل خام، عملیات ویرایش دسته ای برای رسانه، و یک رابط کاربری به روز شده برای چارچوب دسترسی به فضای ذخیره سازی.
این نسخه همچنین بهبودهایی را در زمینه فضای ذخیرهسازی محدوده ارائه میکند که این امر باعث میشود توسعهدهندگان پس از مهاجرت به استفاده از این مدل ذخیرهسازی ، موارد استفاده از فضای ذخیرهسازی خود را انجام دهند.
اجرای فضای ذخیره سازی محدوده
برنامههایی که روی Android 11 اجرا میشوند اما Android 10 (سطح API 29) را هدف قرار میدهند همچنان میتوانند ویژگی requestLegacyExternalStorage
را درخواست کنند. این پرچم به برنامهها اجازه میدهد تا بهطور موقت از تغییرات مرتبط با فضای ذخیرهسازی محدوده، مانند اعطای دسترسی به دایرکتوریهای مختلف و انواع مختلف فایلهای رسانه، انصراف دهند . پس از اینکه برنامه خود را برای هدف قرار دادن Android 11 به روز کردید، سیستم پرچم requestLegacyExternalStorage
را نادیده می گیرد.
سازگاری با اندروید 10 را حفظ کنید
اگر برنامه شما هنگام اجرا بر روی دستگاههای Android 10 از فضای ذخیرهسازی محدوده منصرف میشود، توصیه میشود همچنان در فایل مانیفست برنامهتان requestLegacyExternalStorage
روی true
تنظیم کنید. به این ترتیب، برنامه شما میتواند همانطور که انتظار میرود در دستگاههایی که Android 10 دارند، رفتار کند.
انتقال داده ها به دایرکتوری هایی که هنگام استفاده از فضای ذخیره سازی محدوده قابل مشاهده هستند
اگر برنامه شما از مدل ذخیرهسازی قدیمی استفاده میکند و قبلاً Android 10 یا پایینتر را هدف قرار داده است، ممکن است دادهها را در فهرستی ذخیره کنید که وقتی مدل فضای ذخیرهسازی محدوده فعال است، برنامه شما نتواند به آن دسترسی داشته باشد. قبل از اینکه Android 11 را هدف قرار دهید، دادهها را به فهرستی منتقل کنید که با فضای ذخیرهسازی محدوده سازگار است.
ذخیره سازی با محدوده آزمایشی
برای فعال کردن فضای ذخیرهسازی دامنهدار در برنامهتان، صرفنظر از نسخه SDK هدف برنامهتان و مقادیر پرچم مانیفست، پرچمهای سازگاری برنامه زیر را فعال کنید:
-
DEFAULT_SCOPED_STORAGE
(به طور پیش فرض برای همه برنامه ها فعال است) -
FORCE_ENABLE_SCOPED_STORAGE
(به طور پیشفرض برای همه برنامهها غیرفعال است)
برای غیرفعال کردن فضای ذخیرهسازی محدوده و استفاده از مدل ذخیرهسازی قدیمی، هر دو پرچم را از حالت تنظیم خارج کنید .
مدیریت حافظه دستگاه
با شروع اندروید 11، برنامههایی که از مدل فضای ذخیرهسازی دامنهدار استفاده میکنند، فقط میتوانند به فایلهای کش مخصوص برنامه خود دسترسی داشته باشند. اگر برنامه شما نیاز به مدیریت فضای ذخیرهسازی دستگاه دارد، دستورالعملهای مربوط به نحوه درخواست فضای خالی را دنبال کنید.
- با فراخوانی اقدام قصد
ACTION_MANAGE_STORAGE
فضای خالی را بررسی کنید. اگر فضای خالی کافی در دستگاه وجود ندارد، از کاربر بخواهید به برنامه شما رضایت دهد تا همه حافظه های پنهان را پاک کند. برای انجام این کار، اقدام قصد
ACTION_CLEAR_APP_CACHE
را فراخوانی کنید.
فهرست راهنمای ویژه برنامه در حافظه خارجی
با شروع Android 11، برنامهها نمیتوانند دایرکتوری مخصوص برنامه خود را در حافظه خارجی ایجاد کنند. برای دسترسی به دایرکتوری که سیستم برای برنامه شما فراهم می کند، getExternalFilesDirs()
را فراخوانی کنید.
دسترسی به فایل رسانه ای
برای آسانتر کردن دسترسی به رسانه و حفظ حریم خصوصی کاربر، اندروید 11 قابلیتهای زیر را اضافه میکند.
انجام عملیات دسته ای
برای سازگاری بین دستگاهها و راحتی بیشتر کاربر، Android 11 چندین روش را اضافه میکند که مدیریت گروههای فایلهای رسانه را آسانتر میکند.
با استفاده از مسیرهای فایل مستقیم و کتابخانه های بومی به فایل ها دسترسی پیدا کنید
برای کمک به عملکرد روانتر برنامه شما با کتابخانههای رسانه شخص ثالث، Android 11 به شما امکان میدهد از APIهایی غیر از MediaStore
API برای دسترسی به فایلهای رسانه از فضای ذخیرهسازی مشترک با استفاده از مسیرهای فایل مستقیم استفاده کنید. این APIها شامل موارد زیر است:
- API
File
. - کتابخانه های بومی، مانند
fopen()
.
دسترسی به داده های سایر برنامه ها
برای محافظت از حریم خصوصی کاربر، در دستگاههایی که دارای Android 11 یا بالاتر هستند، سیستم دسترسی برنامه شما را به فهرستهای خصوصی برنامههای دیگر محدود میکند.
دسترسی به دایرکتوری های داده در حافظه داخلی
Android 9 (سطح API 28) شروع به محدود کردن برنامههایی کرد که میتوانند فایلهای موجود در فهرست اطلاعات خود را در حافظه داخلی در دسترس سایر برنامهها قرار دهند. برنامههایی که Android 9 یا بالاتر را هدف قرار میدهند ، نمیتوانند فایلهای موجود در فهرست راهنمای دادههای خود را در دسترس جهانی قرار دهند .
اندروید 11 بر اساس این محدودیت گسترش می یابد. اگر برنامه شما اندروید 11 را هدف قرار دهد، نمیتواند به فایلهای فهرست دادههای هر برنامه دیگری دسترسی داشته باشد، حتی اگر برنامه دیگر اندروید 8.1 (سطح API 27) یا پایینتر را هدف قرار دهد و فایلهای موجود در فهرست دادههای خود را قابل خواندن جهانی کرده باشد.
دسترسی به دایرکتوری های خاص برنامه در حافظه خارجی
در Android 11، برنامهها دیگر نمیتوانند به فایلهای موجود در فهرست اختصاصی برنامههای دیگر در حافظه خارجی دسترسی داشته باشند.
محدودیت های دسترسی به اسناد
برای اینکه به توسعه دهندگان زمان برای آزمایش بدهید، تغییرات زیر مربوط به چارچوب دسترسی به فضای ذخیره سازی (SAF) تنها در صورتی اعمال می شود که برنامه شما اندروید 11 یا بالاتر را هدف قرار دهد.
دسترسی به دایرکتوری ها
دیگر نمیتوانید از اقدام ACTION_OPEN_DOCUMENT_TREE
برای درخواست دسترسی به فهرستهای راهنمای زیر استفاده کنید:
- دایرکتوری ریشه حجم حافظه داخلی.
- دایرکتوری ریشه هر حجم کارت SD که سازنده دستگاه آن را قابل اعتماد می داند، صرف نظر از اینکه کارت شبیه سازی شده یا قابل جابجایی است. حجم قابل اعتماد حجمی است که یک برنامه در بیشتر مواقع با موفقیت به آن دسترسی داشته باشد.
- دایرکتوری
Download
.
دسترسی به فایل ها
دیگر نمیتوانید از اقدام ACTION_OPEN_DOCUMENT_TREE
یا ACTION_OPEN_DOCUMENT
برای درخواست از کاربر درخواست انتخاب فایلهای فردی از فهرستهای زیر استفاده کنید:
- فهرست
Android/data/
و همه زیر شاخه ها. - دایرکتوری
Android/obb/
و همه زیر شاخه ها.
تغییر را آزمایش کنید
برای آزمایش این تغییر رفتار، موارد زیر را انجام دهید:
- با عمل
ACTION_OPEN_DOCUMENT
یک هدف را فراخوانی کنید. بررسی کنید که فهرستهایAndroid/data/
وAndroid/obb/
هر دو ظاهر نشوند. - یکی از کارهای زیر را انجام دهید:
- پرچم سازگاری برنامه
RESTRICT_STORAGE_ACCESS_FRAMEWORK
را فعال کنید. - اندروید 11 یا بالاتر را هدف قرار دهید.
- پرچم سازگاری برنامه
- با عمل
ACTION_OPEN_DOCUMENT_TREE
یک هدف را فراخوانی کنید. بررسی کنید که دایرکتوریDownload
ظاهر شود و دکمه اکشن مرتبط با دایرکتوری خاکستری باشد.
مجوزها
اندروید 11 تغییرات زیر را در رابطه با مجوزهای ذخیره سازی معرفی می کند.
هر نسخه ای را هدف قرار دهید
بدون توجه به نسخه SDK هدف برنامه شما، تغییرات زیر در Android 11 اعمال می شود:
- مجوز زمان اجرا Storage به Files & Media تغییر نام داده است.
اگر برنامه شما از فضای ذخیرهسازی محدوده خارج نشده است و مجوز
READ_EXTERNAL_STORAGE
را درخواست میکند، کاربران گفتگوی متفاوتی را در مقایسه با Android 10 میبینند. کادر گفتگو نشان میدهد که برنامه شما درخواست دسترسی به عکسها و رسانه را دارد، همانطور که در شکل 1 نشان داده شده است.کاربران میتوانند ببینند کدام برنامهها مجوز
READ_EXTERNAL_STORAGE
را در تنظیمات سیستم دارند. در صفحه تنظیمات > حریم خصوصی > مدیر مجوز > فایلها و رسانه ، هر برنامهای که مجوز را دارد در قسمت مجاز برای همه فایلها فهرست میشود. اگر برنامه شما اندروید 11 را هدف قرار می دهد، به خاطر داشته باشید که این دسترسی به "همه فایل ها" فقط خواندنی است. برای خواندن و نوشتن روی همه فایلهای موجود در فضای ذخیرهسازی مشترک با استفاده از این برنامه، باید مجوز دسترسی به همه فایلها را داشته باشید.
اندروید 11 را هدف قرار دهید
اگر برنامه شما Android 11 را هدف قرار می دهد، هم مجوز WRITE_EXTERNAL_STORAGE
و هم مجوز ممتاز WRITE_MEDIA_STORAGE
دیگر هیچ دسترسی اضافی را ارائه نمی دهند.
به خاطر داشته باشید که در دستگاههایی که دارای Android 10 (سطح API 29) یا بالاتر هستند، برنامه شما میتواند بدون درخواست مجوزهای مربوط به فضای ذخیرهسازی، در مجموعههای رسانهای کاملاً تعریفشده مانند MediaStore.Downloads
مشارکت کند. درباره نحوه درخواست تنها مجوزهای لازم هنگام کار با فایل های رسانه ای در برنامه خود بیشتر بیاموزید.
دسترسی به همه فایل ها
اکثر برنامههایی که نیاز به دسترسی به فضای ذخیرهسازی مشترک دارند، میتوانند بهترین روشها را برای اشتراکگذاری فایلهای رسانهای و اشتراکگذاری فایلهای غیررسانهای دنبال کنند. با این حال، برخی از برنامهها یک مورد استفاده اصلی دارند که نیاز به دسترسی گسترده به فایلهای دستگاه دارد، اما نمیتوانند این کار را با استفاده از بهترین شیوههای ذخیرهسازی سازگار با حریم خصوصی انجام دهند. اندروید برای این مواقع یک برنامه دسترسی ویژه به نام دسترسی به همه فایل ها را فراهم می کند. برای کسب اطلاعات بیشتر، راهنمای نحوه مدیریت همه فایلها در یک دستگاه ذخیرهسازی را ببینید.
منابع اضافی
برای اطلاعات بیشتر در مورد تغییرات حافظه در اندروید 11، مطالب زیر را مشاهده کنید: