اندروید 11 (API level 30) علاوه بر تقویت پلتفرم, به دنبال بهتر کردن حفاظت از برنامه ها و داده های ذخیره شده کاربر در حافظه می باشد. در این نسخه چند پیشرفت معرفی شده است مانند دسترسی به مسیر خام فایل برای رسانه, عملیات ویرایش دسته ای برای رسانه ها و بروزرسانی UI برای فریم ورک دسترسی به حافظه. به طور کامل در اندروید 11 تغییرات زیادی برای مدیریت فایل ها انجام شده است.
این نسخه همچنین بهبود در ذخیره سازی یا همان محدوده ذخیره سازی را معرفی میکند تا توسعه دهندگان بعد از کوچ کردن به این نوع مدل از ذخیره سازی, بتوانند به راحتی نیاز های خود را برطرف کنند.
اجرای محدوده ذخیره سازی در اندروید 11
برنامه های که در اندروید 11 اجرا میشوند و اندروید 10 را هدف قرار داده اند همچنان می توانند از اتریبیوت requestLegacyExternalStorage استفاده کنند. این flag به برنامه ها این امکان را می دهد تا به طور موقت از تغییرات مرتبط با فضای ذخیره سازی مانند دسترسی به دایرکتوری های مختلف و انواع مختلف فایل های رسانه ای انصراف دهند, بعد از آن که برنامه خود را ارتقا دهید و اندروید 11 را هدف قرار دهید سیستم این اتریبیوت را نادیده میگرد.
سازگاری با اندروید 10 را حفظ کنید
زمانی که اپلیکیشن شما از در اندروید 10 اجرا می شود و از محدوده ذخیره سازی انصراف داده است پیشنهاد میشود تا در فایل androidmanifest خود اتریبیوت requestLegacyExternalStorage برابر با true قرار بدهید, به این شکل برنامه ی شما می توانند به آن گونه ای که انتظار دارید در اندروید 10 رفتار کند.
انتقال داده ها به فهرستهایی که هنگام استفاده از فضای ذخیره سازی قابل مشاهده هستند
اگر اپلیکیشن شما از نسخه ی قدیمی ذخیره سازی استفاده میکند و قبلا اندروید 10 یا پایین تر را هدف قرار داده است, ممکن است شما بتوانید داده ها را در یک مسیری ذخیره سازی کنید اما برنامه شما نمی تواند زمانی که مدل محدود ذخیره سازی فعال باشد به آن اطلاعات در حافظه ای که اندروید 11 آن را مدیریت میکند دسترسی داشته باشد, قبلا از هدف قرار دادن اندروید 11, داده ها را به یک دایرکتوری که با فضای ذخیره سازی سازگار, سازگار است منتقل کنید.
تست محدوده ذخیره سازی
- DEFAULT_SCOPED_STORAGE برای تمامی اپلیکیشن ها به صورت پیش فرض فعال است.
- FORCE_ENABLE_SCOPED_STORAGE برای تمامی اپلیکیشن ها به صورت پیش فرض غیرفعال است.
مدیریت حافظه دستگاه در اندروید 11
در اندروید 11, برنامه های که از محدوده ذخیره سازی استفاده میکنند فقط میتوانند به فایل های کش شده برنامه خود دسترسی داشته باشند. اگر برنامه ی شما نیاز دارد تا حافظه دستگاه را مدیریت کند, دستورالعمل های مربوط به نحوه query زدن در فضا خالی را دنبال کنید.
- فضای خالی را با استناد action اینتنت ACTION_MANAGE_STORAGE بررسی کنید.
- اگر در دستگاه فضای خالی کافی وجود نداشته باشد, از کاربر برای حذف حافظه پنهان درخواست کنید, برای انجام این درخواست با action اینتنت ACTION_CLEAR_APP_CACHE استناد کنید.
نکته : action اینتنت ACTION_CLEAR_APP_CACHE می تواند به طور قابل توجهی بر عمر باتری دستگاه تأثیر بگذارد و ممکن است تعداد زیادی پرونده را از دستگاه حذف کند.
دایرکتوری مخصوص اپلیکیشن در حافظه
در اندروید 11 شروع شده است که برنامه ها نمی توانند دایرکتوری های ویژه خود را ایجاد کنند, برای دسترسی به دایرکتوری که سیستم برای برنامه ی شما فراهم کرده است باید متد getExternalFilesDirs() را فراخوانی کنید.
دسترسی به فایل رسانه ای
برای این که به راحتی به رسانه ها دسترسی داشته باشید و امنیت کاربر را حفظ کنید, اندروید 11 چندین متد برای راحتتر کردن مدیریت گروهی فایل های رسانه ای فراهم کرده است. که بزودی درباره این راه ها و نحوه استفاده از آن صحبت خواهیم کرد.
دسترسی به فایل ها با استفاده از مسیر مستقیم و کتابخانه های بومی
برای کمک به برنامه شما در راحت تر کار کردن با کتابخانه های رسانه شخص ثالث, اندروید 11 به شما اجازه می دهد تا از API های دیگر به غیر از MediaStore API برای دسترسی به مسیر مستقیم فایل های رسانه ای فضای ذخیره سازی مشترک استفاده کنید.
این API شامل موارد زیر هستند :
- API مربوط به File
- کتابخانه های بومی مانند fopen
دسترسی به داده های برنامه های دیگر
برای حفظ حریم خصوصی کاربر در دستگاه های که از اندروید 11 یا بالاتر استفاده میکنند, سیستم برنامه شما را برای دسترسی به دایرکتوری های خصوصی دیگر برنامه محدود میکند.
-
دسترسی به دایرکتوری های داده در حافظه داخلی
اندروید 9 شروع به محدود کردن برنامه های که میتوانند فایل های را به صورت عمومی به طوری که در دسترسی دیگر برنامه ها باشد در داخل حافظه داخلی ایجاد کند, کرده است. برنامه هایی که اندروید 9 یا بالاتر را هدف قرار می دهند نمی توانند پرونده های موجود در فهرست داده هایشان را در دسترس سایر اپلیکیشن ها قرار دهند.
اما اندروید 11 با وجود این محدودیت ها گسترش زیادی یافته است. باید بدانید که نمیتوانید به فایل های که در دایرکتوری های خصوصی دیگر اپلیکیشن ها هستند دسترسی داشته باشید. حتی اگر دیگر برنامه ها هدف توسعه شان اندروید 8 یا پایین تر باشد. یا دسترسی به داده هایشان را به صورتی عمومی کرده باشند.
-
دسترسی به دایرکتوری های خاص برنامه در حافظه خارجی
در اندروید 11, برنامه ها نمی توانند دیگر به فایل های اختصاصی دیگر برنامه ها دسترسی داشته باشند. به این دلیل که هر برنامه دارای دایرکتوری مخصوص خودشان هستند.
محدودیت های دسترسی به سند
برای دادن فرصت تست به توسعه دهندگان, تغییرات پایین مربوط به Storage Access Framework(SAF) می باشد. این موارد زمانی تاثیر گذار است که شما اندروید 11 یا بالاتر را هدف قرار بدهید.
دسترسی به دایرکتوری ها
شما دیگر نمی توانید از طریق action اینتنت ACTION_OPEN_DOCUMENT_TREE برای دسترسی به دایرکتوری های زیر استفاده کنید:
- روت دایرکتوری حافظه داخلی
- روت هر SD کارتی که قابل اعتماد باشد.
- دایرکتوری دانلود
دسترسی به فایل ها در اندروید 11
شما دیگر نمیتواند در اندروید 11 از action اینتنت ACTION_OPEN_DOCUMENT_TREE یا ACTION_OPEN_DOCUMENT برای دسترسی فایل های شخصی که در زیر دایرکتوری های آن مشخص شده است استفاده کنید :
- Android/data/ و تمامی زیر پوشه های آن (دسترسی به پوشه دیتا (data) در اندروید 11)
- Android/obb/ وتمامی زیر پوشه های آن (دسترسی به پوشه obb در اندروید 11)
تست تغییرات
برای تست رفتار های تغییر داده شده, مراحل زیر رو انجام دهید:
- action اینتنت ACTION_OPEN_DOCUMENT را برای دایرکتوری های Android/data/ و Android/obb/ درخواست کنید اما هیچ چیزی ظاهر نمی شود.
- یکی از موارد زیر را انجام بدهید:
- flag سازگاری RESTRICT_STORAGE_ACCESS_FRAMEWORK را برای اپلیکیشن فعال کنید.
- اندروید 11 یا بالاتر را هدف قرار دهید.
- action اینتنت ACTION_OPEN_DOCUMENT_TREE را درخواست کنید. بعد از بررسی متوجه خواهید شد که دایرکتوری Download ظاهر میشود. دکمه اقدام مرتبط با دایرکتوری به رنگ خاکستری درآمده است.
مجوز ها
در اندروید 11 تغییراتی در رابطه با مجوزهای دسترسی به حافظه داده شده است.در ادامه به این مجوزها و محدودیت ها در اندروید 11 پرداخته ایم.
هدف قرار دادن هر نسخه ای از اندروید
تغییرات زیر در اندروید 11 برای حافظه اعمال میشود, صرف نظر از نسخه ی SDK ای که مورد هدف قرار داده اید.
- تغییر نام مجوز ران تایم (زمانی که برنامه در حال اجرا باشد و از کاربر درخواست اعطای مجوز داریم) Storage به File & Media (فایل و رسانه ها)
- اگر برنامه شما از قابلیت محدوده ذخیره سازی استفاده نمیکند, و درخواست مجوز READ_EXTERNAL_STORAGE کنید. کاربران دیالوگ متفاوتی در اندروید 10 مشاهده میکنند. در این دیالوگ مشخص میشود که برنامه شما مجوز درخواست دسترسی به فایلها و رسانه های درون حافظه را دارد. مانند تصویر زیر :
کاربر می تواند ببیند که به چه برنامه های مجوز READ_EXTERNAL_STORAGE در سیستم داده شده است. از صفحه تنظیمات > حریم خصوصی > مدیریت مجوز ها > فایل ها و رسانه ها. هر برنامه ای که مجوز به آن داده شده باشد, مجاز به دسترسی به تمام فایل ها است. در اندروید 11 باید در نظر بگیرید که مجوز دسترسی به تمام فایلها فقط برای خواندن آن فایل ها میباشد. در رابطه با دریافت مجوز کامل برای نوشتن و خواندن فایل در آموزشی بعدی در رابطه آن صحبت خواهیم کرد.
هدف قرار دادن اندروید 11
اگر پروژه شما اندروید 11 را هدف قرار داده باشد. با استفاده از مجوز های WRITE_EXTERNAL_STORAGE و WRITE_MEDIA_STORAGE دیگر نمیتواند هیچ دسترسی اضافه ای بر روی حافظه داشته باشد.
در تلفن هایی که نسخه اندروید آن ها 10 یا بالاتر باشد. اپلیکیشن شما میتواند بدون نیاز به درخواست مجوز در برخی از کار ها مانند ذخیره فایل ها در دایرکتوری Download کمک کند. در مقاله ای دیگر در رابطه با درخواست مجوز های ضروری را توضیح خواهیم داد.
ناصر جوان (مشترک)
3 سال 8 ماه قبل
جالبه توی نسخه ۱۱ تغییرات زیادی برای حافظه در نظر گرفته شده