روال‌های مطلوب و موارد استفاده از فضای ذخیره‌سازی Android

برای اینکه کاربران کنترل بیشتری روی فایل‌هایشان داشته باشند و به‌هم‌ریختگی فایل‌ها محدود شود، Android 10 الگوی ذخیره‌سازی جدیدی برای برنامه‌ها معرفی کرد که فضای ذخیره‌سازی محدود نام دارد. فضای ذخیره‌سازی محدودشده نحوه ذخیره و دسترسی برنامه‌ها به فایل‌ها در فضای ذخیره‌سازی خارجی دستگاه را تغییر می‌دهد. برای کمک به شما در انتقال برنامه‌تان برای پشتیبانی از فضای ذخیره‌سازی محدود، روال‌های مطلوب برای موارد استفاده رایج از فضای ذخیره‌سازی را که در این راهنما شرح داده شده است دنبال کنید. موارد استفاده به دو دسته تقسیم می‌شوند: مدیریت فایل‌های رسانه‌ای و مدیریت فایل‌های غیررسانه‌ای.

در بسیاری از موارد، برنامه‌تان فایل‌هایی ایجاد می‌کند که برنامه‌های دیگر نیازی به دسترسی به آن‌ها ندارند، یا نباید به آن‌ها دسترسی داشته باشند. سیستم مکان‌های ذخیره‌سازی مختص برنامه را برای مدیریت چنین فایل‌هایی ارائه می‌دهد.

برای کسب اطلاعات بیشتر درباره نحوه ذخیره و دسترسی به فایل‌ها در Android، راهنماهای آموزشی فضای ذخیره‌سازی را ببینید.

مدیریت فایل‌های رسانه‌ای

این بخش برخی‌از موارد استفاده رایج برای مدیریت فایل‌های رسانه‌ای (فایل‌های ویدیویی، تصویری، و صوتی) را شرح می‌دهد و رویکرد سطح بالایی را که برنامه‌تان می‌تواند استفاده کند توضیح می‌دهد. جدول زیر هریک از این موارد استفاده را خلاصه می‌کند و به هریک از بخش‌هایی که حاوی جزئیات بیشتر هستند پیوند می‌دهد.

مورد استفاده خلاصه
نمایش همه فایل‌های تصویری یا ویدیویی از همین رویکرد برای همه نسخه‌های Android استفاده کنید.
نمایش تصاویر یا ویدیوها از پوشه‌ای خاص از همین رویکرد برای همه نسخه‌های Android استفاده کنید.
دسترسی به اطلاعات مکان از عکس‌ها اگر برنامه‌تان از فضای ذخیره‌سازی محدودشده استفاده می‌کند، از یک رویکرد استفاده کنید. اگر برنامه‌تان از فضای ذخیره‌سازی محدودشده انصراف می‌دهد، از رویکرد دیگری استفاده کنید.
تعیین مکان ذخیره‌سازی برای بارگیری‌های جدید اگر برنامه‌تان از فضای ذخیره‌سازی محدودشده استفاده می‌کند، از یک رویکرد استفاده کنید. اگر برنامه‌تان از فضای ذخیره‌سازی محدودشده انصراف می‌دهد، از رویکرد دیگری استفاده کنید.
صادر کردن فایل‌های رسانه‌ای کاربر به دستگاه از همین رویکرد برای همه نسخه‌های Android استفاده کنید.
اصلاح یا حذف چند فایل رسانه‌ای در یک عملیات از یک رویکرد برای Android 11 استفاده کنید. برای Android 10، از فضای ذخیره‌سازی محدودشده انصراف دهید و به‌جای آن از رویکرد Android 9 و نسخه‌های پایین‌تر استفاده کنید.
وارد کردن یک تصویر که ازقبل وجود دارد از همین رویکرد برای همه نسخه‌های Android استفاده کنید.
گرفتن یک تصویر از همین رویکرد برای همه نسخه‌های Android استفاده کنید.
هم‌رسانی فایل‌های رسانه‌ای با برنامه‌های دیگر از همین رویکرد برای همه نسخه‌های Android استفاده کنید.
هم‌رسانی فایل‌های رسانه‌ای با برنامه‌ای خاص از همین رویکرد برای همه نسخه‌های Android استفاده کنید.
دسترسی به فایل‌ها از کد یا کتابخانه‌هایی که از مسیرهای مستقیم فایل استفاده می‌کنند از یک رویکرد برای Android 11 استفاده کنید. برای Android 10، از فضای ذخیره‌سازی محدودشده انصراف دهید و به‌جای آن از رویکرد Android 9 و نسخه‌های پایین‌تر استفاده کنید.

نمایش فایل‌های تصویری یا ویدیویی از چند پوشه

پرس‌وجو کردن مجموعه رسانه بااستفاده از میانای برنامه‌سازی کاربردی query(). برای فیلتر کردن یا مرتب کردن فایل‌های رسانه‌ای، پارامترهای projection، selection، selectionArgs، و sortOrder را تنظیم کنید.

نمایش تصاویر یا ویدیوها از پوشه‌ای خاص

از این رویکرد استفاده کنید:

  1. با دنبال کردن روال‌های مطلوب شرح داده‌شده در درخواست اجازه‌های برنامه، اجازه READ_EXTERNAL_STORAGE را درخواست کنید.
  2. فایل‌های رسانه‌ای را براساس مقدار MediaColumns.DATA بازیابی کنید که حاوی مسیر مطلق سیستم فایل به فایل رسانه‌ای در دیسک است.

توجه: وقتی به فایل رسانه موجودی دسترسی پیدا می‌کنید، می‌توانید از مقدار ستون DATA در منطق خود استفاده کنید. دلیلش این است که این مقدار مسیر فایل معتبری دارد. اما فرض نکنید که فایل همیشه دردسترس است. برای رسیدگی به هرگونه خطای ورودی/خروجی مبتنی بر فایل که ممکن است رخ دهد آماده باشید.

ازسوی‌دیگر، برای ایجاد یا به‌روزرسانی فایل رسانه‌ای، از ستون DATA استفاده نکنید. درعوض، از ستون‌های DISPLAY_NAME و RELATIVE_PATH استفاده کنید.

دسترسی به اطلاعات مکان از عکس‌ها

اگر برنامه‌تان از فضای ذخیره‌سازی محدودشده استفاده می‌کند، مراحل بخش اطلاعات مکان در عکس‌ها در راهنمای فضای ذخیره‌سازی رسانه را دنبال کنید.

تعیین مکان ذخیره‌سازی برای بارگیری‌های جدید

اگر برنامه‌تان از فضای ذخیره‌سازی محدودشده استفاده می‌کند، به مکانی که برای ذخیره کردن فایل‌های رسانه‌ای بارگیری‌شده انتخاب می‌کنید توجه داشته باشید.

اگر برنامه‌های دیگر نیاز به دسترسی به فایل‌ها دارند، از مجموعه‌های رسانه به‌خوبی تعریف‌شده برای بارگیری‌ها یا مجموعه‌های سند استفاده کنید.

در Android نسخه ۱۱ و بالاتر، فایل‌های موجود در دایرکتوری خارجی مختص برنامه شما برای برنامه‌های دیگر قابل‌دسترسی نیست، حتی اگر از DownloadManager برای واکشی این فایل‌ها استفاده کنید.

صادر کردن فایل‌های رسانه‌ای کاربر به دستگاه

مکان پیش‌فرض مناسبی برای ذخیره فایل‌های رسانه‌ای کاربر تعریف کنید:

اصلاح یا حذف چند فایل رسانه‌ای در یک عملیات

منطقی را براساس نسخه‌های Android که برنامه‌تان در آن‌ها اجرا می‌شود اضافه کنید.

درحال اجرا در Android 11

از این رویکرد استفاده کنید:

  1. بااستفاده از MediaStore.createWriteRequest() یا MediaStore.createTrashRequest() یک قصد معوق برای درخواست نوشتن یا حذف برنامه‌تان ایجاد کنید و سپس با فراخوانی آن قصد، از کاربر بخواهید اجازه ویرایش مجموعه‌ای از فایل‌ها را بدهد.
  2. پاسخ کاربر را ارزیابی کنید:

    • اگر اجازه اعطا شده بود، عملیات اصلاح یا حذف را ادامه دهید.
    • اگر اجازه اعطا نشده است، برای کاربر توضیح دهید که چرا ویژگی موجود در برنامه‌تان به این اجازه نیاز دارد.

درباره نحوه مدیریت کردن گروه‌های فایل‌های رسانه‌ای بااستفاده از این روش‌ها که در Android نسخه ۱۱ و بالاتر دردسترس است بیشتر بدانید.

درحال اجرا در Android 10

اگر برنامه شما Android 10 (سطح API ‏۲۹) را هدف قرار می‌دهد، از فضای ذخیره‌سازی محدودشده انصراف دهید و برای انجام این عملیات، به استفاده از رویکرد Android 9 و نسخه‌های پایین‌تر ادامه دهید.

در Android 9 یا پایین‌تر اجرا می‌شود

از این رویکرد استفاده کنید:

  1. با دنبال کردن روال‌های مطلوب شرح داده‌شده در درخواست اجازه‌های برنامه، اجازه WRITE_EXTERNAL_STORAGE را درخواست کنید.
  2. برای اصلاح یا حذف فایل‌های رسانه‌ای، از میانای برنامه‌سازی کاربردی MediaStore استفاده کنید.

وارد کردن یک تصویر که ازقبل وجود دارد

وقتی می‌خواهید یک تصویر موجود را وارد کنید (برای مثال، برای استفاده به‌عنوان عکس نمایه کاربر)، برنامه‌تان می‌تواند از واسط کاربر خودش برای این عملیات استفاده کند یا می‌تواند از انتخاب‌گر سیستم استفاده کند.

ارائه میانای کاربر خودتان

از این رویکرد استفاده کنید:

  1. با دنبال کردن روال‌های مطلوب شرح داده‌شده در درخواست اجازه‌های برنامه، اجازه READ_EXTERNAL_STORAGE را درخواست کنید.
  2. از query() API برای پرس‌وجو از مجموعه رسانه استفاده کنید.
  3. نتایج را در واسط کاربر سفارشی برنامه‌تان نمایش دهید.

استفاده از انتخاب‌گر سیستم

از هدف ACTION_GET_CONTENT استفاده کنید که از کاربر می‌خواهد تصویری را برای وارد کردن انتخاب کند.

اگر می‌خواهید انواع تصاویری را که انتخاب‌گر سیستم برای انتخاب به کاربر ارائه می‌دهد فیلتر کنید، می‌توانید از setType() یا EXTRA_MIME_TYPES استفاده کنید.

ثبت یک تصویر

وقتی می‌خواهید یک تصویر تکی برای استفاده در برنامه‌تان بگیرید (برای مثال، برای استفاده به‌عنوان عکس نمایه کاربر)، از هدف ACTION_IMAGE_CAPTURE استفاده کنید تا از کاربر بخواهید بااستفاده از دوربین دستگاه عکس بگیرد. سیستم عکس گرفته‌شده را در جدول MediaStore.Images ذخیره می‌کند.

هم‌رسانی فایل‌های رسانه‌ای با برنامه‌های دیگر

از روش insert() برای افزودن مستقیم سوابق به MediaStore استفاده کنید. برای اطلاعات بیشتر، بخش افزودن مورد در راهنمای فضای ذخیره‌سازی رسانه را ببینید.

هم‌رسانی فایل‌های رسانه‌ای با برنامه‌ای خاص

از مؤلفه FileProvider Android استفاده کنید، همان‌طور که در راهنمای راه‌اندازی هم‌رسانی فایل شرح داده شده است.

دسترسی به فایل‌ها از کد یا کتابخانه‌هایی که از مسیرهای مستقیم فایل استفاده می‌کنند

منطقی را براساس نسخه‌های Android که برنامه‌تان در آن‌ها اجرا می‌شود اضافه کنید.

درحال اجرا در Android 11

از این رویکرد استفاده کنید:

  1. با دنبال کردن روال‌های مطلوب شرح داده‌شده در درخواست اجازه‌های برنامه، اجازه READ_EXTERNAL_STORAGE را درخواست کنید.
  2. بااستفاده از مسیرهای مستقیم فایل به فایل‌ها دسترسی پیدا کنید.

برای اطلاعات بیشتر، بخش مربوط به نحوه باز کردن فایل‌های رسانه‌ای بااستفاده از مسیرهای مستقیم فایل را ببینید.

درحال اجرا در Android 10

اگر برنامه شما Android 10 (سطح API ‏۲۹) را هدف قرار می‌دهد، از فضای ذخیره‌سازی محدودشده انصراف دهید و برای انجام این عملیات، به استفاده از رویکرد Android 9 و نسخه‌های پایین‌تر ادامه دهید.

در Android 9 یا پایین‌تر اجرا می‌شود

از این رویکرد استفاده کنید:

  1. با دنبال کردن روال‌های مطلوب شرح داده‌شده در درخواست اجازه‌های برنامه، اجازه WRITE_EXTERNAL_STORAGE را درخواست کنید.
  2. بااستفاده از مسیرهای مستقیم فایل، به فایل‌ها دسترسی پیدا کنید.

مدیریت فایل‌های غیررسانه‌ای

این بخش برخی‌از موارد استفاده رایج برای مدیریت فایل‌های غیررسانه‌ای را شرح می‌دهد و رویکرد سطح بالایی را که برنامه‌تان می‌تواند استفاده کند توضیح می‌دهد. جدول زیر هریک از این موارد استفاده را خلاصه می‌کند و به هریک از بخش‌هایی که حاوی جزئیات بیشتر هستند پیوند می‌دهد.

مورد استفاده خلاصه
باز کردن فایل سند از همین رویکرد برای همه نسخه‌های Android استفاده کنید.
نوشتن در فایل‌های موجود در فضاهای ذخیره‌سازی فرعی از یک رویکرد برای Android 11 استفاده کنید. برای نسخه‌های قدیمی‌تر Android از رویکرد دیگری استفاده کنید.
انتقال فایل‌های موجود از مکان ذخیره‌سازی قدیمی درصورت امکان، فایل‌هایتان را به فضای ذخیره‌سازی محدودشده منتقل کنید. درصورت لزوم، از فضای ذخیره‌سازی محدودشده برای Android 10 انصراف دهید.
هم‌رسانی محتوا با برنامه‌های دیگر از همین رویکرد برای همه نسخه‌های Android استفاده کنید.
ذخیره فایل‌های غیررسانه‌ای در حافظه نهان از همین رویکرد برای همه نسخه‌های Android استفاده کنید.
صادر کردن فایل‌های غیررسانه‌ای به دستگاه اگر برنامه‌تان از فضای ذخیره‌سازی محدودشده استفاده می‌کند، از یک رویکرد استفاده کنید. اگر برنامه‌تان از فضای ذخیره‌سازی محدودشده انصراف می‌دهد، از رویکرد دیگری استفاده کنید.

باز کردن فایل سند

از هدف ACTION_OPEN_DOCUMENT استفاده کنید تا از کاربر بخواهید فایلی را برای باز کردن بااستفاده از انتخاب‌گر سیستم انتخاب کند. اگر می‌خواهید انواع فایل‌هایی را که انتخابگر سیستم برای انتخاب به کاربر ارائه می‌دهد فیلتر کنید، می‌توانید از setType() یا EXTRA_MIME_TYPES استفاده کنید.

برای مثال، می‌توانید همه فایل‌های PDF،‏ ODT، و TXT را بااستفاده از کد زیر پیدا کنید:

کاتلین

startActivityForResult(
        Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
            addCategory(Intent.CATEGORY_OPENABLE)
            type = "*/*"
            putExtra(Intent.EXTRA_MIME_TYPES, arrayOf(
                    "application/pdf", // .pdf
                    "application/vnd.oasis.opendocument.text", // .odt
                    "text/plain" // .txt
            ))
        },
        REQUEST_CODE
      )

جاوا

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("*/*");
        intent.putExtra(Intent.EXTRA_MIME_TYPES, new String[] {
                "application/pdf", // .pdf
                "application/vnd.oasis.opendocument.text", // .odt
                "text/plain" // .txt
        });
        startActivityForResult(intent, REQUEST_CODE);

نوشتن در فایل‌های موجود در حجم‌های فضای ذخیره‌سازی فرعی

فضاهای ذخیره‌سازی ثانویه شامل کارت‌های SD می‌شود. بااستفاده از کلاس StorageVolume می‌توانید به اطلاعات مربوط به یک حجم ذخیره‌سازی مشخص دسترسی پیدا کنید.

منطق را براساس نسخه Android که برنامه‌تان روی آن اجرا می‌شود ادغام کنید.

درحال اجرا در Android 11

از این رویکرد استفاده کنید:

  1. از مدل فضای ذخیره‌سازی محدود استفاده کنید.
  2. Android 10 (سطح میانای برنامه‌سازی کاربردی ۲۹) یا پایین‌تر را هدف‌یابی کنید.
  3. اجازه WRITE_EXTERNAL_STORAGE را اعلام کنید.
  4. یکی از انواع دسترسی زیر را انجام دهید:
    • دسترسی به فایل بااستفاده از MediaStore API.
    • دسترسی مستقیم به مسیر فایل بااستفاده از میاناهای برنامه‌سازی کاربردی مثل File یا fopen().

درحال اجرا در نسخه‌های قدیمی‌تر

از چارچوب دسترسی به فضای ذخیره‌سازی استفاده کنید که به کاربران اجازه می‌دهد مکان را در حجم فضای ذخیره‌سازی ثانویه انتخاب کنند تا برنامه‌تان بتواند فایل را در آن بنویسد.

انتقال فایل‌های موجود از مکان ذخیره‌سازی قدیمی

اگر دایرکتوری‌ای دایرکتوری مختص برنامه یا دایرکتوری هم‌رسانی‌شده عمومی نباشد، مکان ذخیره‌سازی قدیمی درنظر گرفته می‌شود. اگر برنامه‌تان فایل‌ها را در مکان ذخیره‌سازی قدیمی ایجاد یا مصرف می‌کند، توصیه می‌کنیم فایل‌های برنامه‌تان را به مکان‌هایی منتقل کنید که با فضای ذخیره‌سازی محدودشده قابل‌دسترسی باشند و هرگونه تغییرات لازم را در برنامه ایجاد کنید تا با فایل‌های موجود در فضای ذخیره‌سازی محدودشده کار کند.

دسترسی به مکان فضای ذخیره‌سازی قدیمی را برای انتقال داده حفظ کنید

برنامه‌تان باید دسترسی به مکان ذخیره‌سازی قدیمی را حفظ کند تا بتواند فایل‌های برنامه را به مکان‌هایی که با فضای ذخیره‌سازی محدودشده قابل‌دسترسی هستند منتقل کند. رویکردی که باید استفاده کنید به سطح میانای برنامه‌سازی کاربردی هدف برنامه‌تان بستگی دارد.

اگر برنامه شما Android 11 را هدف قرار می‌دهد
  1. پرچم preserveLegacyExternalStorage را روی true تنظیم کنید تا مدل فضای ذخیره‌سازی قدیمی حفظ شود تا برنامه‌تان بتواند داده‌های کاربر را هنگام ارتقا به نسخه جدید برنامه‌تان که Android 11 را هدف قرار می‌دهد، منتقل کند.

  2. به انصراف از فضای ذخیره‌سازی محدود ادامه دهید تا برنامه‌تان بتواند همچنان به فایل‌هایتان در مکان فضای ذخیره‌سازی قدیمی در دستگاه‌های Android 10 دسترسی داشته باشد.

اگر برنامه‌تان Android 10 را هدف قرار می‌دهد

از فضای ذخیره‌سازی محدودشده انصراف دهید تا حفظ رفتار برنامه‌تان در نسخه‌های Android آسان‌تر شود.

انتقال داده‌های برنامه

وقتی برنامه‌تان برای انتقال آماده شد، از رویکرد زیر استفاده کنید:

  1. Android 10 یا پایین‌تر را هدف قرار دهید.
  2. از فضای ذخیره‌سازی محدودشده انصراف دهید تا برنامه‌تان به فایل‌هایی که باید انتقال دهید دسترسی داشته باشد.
  3. کدی را مستقر کنید که از File API برای انتقال فایل‌ها از مکان فعلی‌شان در /sdcard/ به مکانی که با فضای ذخیره‌سازی محدودشده قابل‌دسترسی است استفاده می‌کند:

    1. همه فایل‌های خصوصی برنامه را به دایرکتوری‌ای که با روش getExternalFilesDir() برگردانده شده است منتقل کنید.
    2. همه فایل‌های غیررسانه‌ای هم‌رسانی‌شده را به زیرفهرست راهنمای اختصاصی برنامه در فهرست راهنمای Downloads/ منتقل کنید.
  4. فهرست‌های راهنمای فضای ذخیره‌سازی قدیمی برنامه‌تان را از فهرست راهنمای /sdcard/ بردارید.

پس‌از اینکه کاربران نسخه جدید برنامه‌تان را نصب کردند، فرایند انتقال داده را در دستگاه‌هایشان تکمیل می‌کنند. با ایجاد رویداد تجزیه‌وتحلیل می‌توانید فرایند انتقال را در پایگاه کاربرتان پایش کنید.

پس‌از اینکه کاربران داده‌هایشان را انتقال دادند، به‌روزرسانی دیگری برای برنامه‌تان منتشر کنید که در آن Android 11 را هدف قرار می‌دهید.

هم‌رسانی محتوا با برنامه‌های دیگر

برای هم‌رسانی فایل‌های برنامه‌تان با یک برنامه دیگر، از FileProvider استفاده کنید. برای برنامه‌هایی که همه نیاز به هم‌رسانی فایل بین یکدیگر دارند، توصیه می‌کنیم برای هر برنامه از ارائه‌دهنده محتوا استفاده کنید و سپس داده‌ها را هم‌زمان با افزودن برنامه‌ها به مجموعه همگام‌سازی کنید.

ذخیره فایل‌های غیررسانه‌ای در حافظه نهان

رویکردی که باید استفاده کنید به نوع فایل‌هایی که باید در حافظه نهان ذخیره کنید بستگی دارد.

  • فایل‌های کوچک یا فایل‌هایی که حاوی اطلاعات حساس هستند: از Context#getCacheDir() استفاده کنید.
  • فایل‌های بزرگ یا فایل‌هایی که حاوی اطلاعات حساس نیستند: از Context#getExternalCacheDir() استفاده کنید.

صادر کردن فایل‌های غیررسانه‌ای به دستگاه

مکان پیش‌فرض مناسبی برای ذخیره کردن فایل‌های غیررسانه‌ای تعریف کنید. به کاربران اجازه دهید فایل‌ها را از دایرکتوری‌های مختص برنامه به مکانی با دسترسی عمومی‌تر صادر کنند. از مجموعه‌های سند یا بارگیری‌های MediaStore برای صادر کردن فایل‌های غیررسانه‌ای به دستگاه استفاده کنید.

مدیریت فایل‌های مختص برنامه

اگر برنامه‌تان فایل‌هایی ایجاد می‌کند که برنامه‌های دیگر نیازی به دسترسی به آن‌ها ندارند، یا نباید به آن‌ها دسترسی داشته باشند، می‌توانید این فایل‌ها را در مکان‌های ذخیره‌سازی مختص برنامه ذخیره کنید.

فهرست‌های راهنمای فضای ذخیره‌سازی داخلی

سیستم از دسترسی برنامه‌های دیگر به این مکان‌ها جلوگیری می‌کند و در Android نسخه ۱۰ (سطح API‏ ۲۹) و بالاتر، این مکان‌ها رمزگذاری می‌شوند. این مکان‌ها محل خوبی برای ذخیره کردن داده‌های حساس است که فقط برنامه‌تان می‌تواند به آن‌ها دسترسی داشته باشد.

فهرست‌های راهنمای فضای ذخیره‌سازی خارجی

اگر حافظه داخلی فضای کافی برای ذخیره فایل‌های مختص برنامه ندارد، به‌جای آن از حافظه خارجی استفاده کنید. اگرچه ممکن است برنامه دیگری به این دایرکتوری‌ها دسترسی داشته باشد اگر آن برنامه اجازه‌های مناسب را داشته باشد، فایل‌های ذخیره‌شده در این دایرکتوری‌ها فقط برای استفاده توسط برنامه شما درنظر گرفته شده‌اند.

در Android نسخه ۴.۴ (سطح میانای برنامه‌سازی کاربردی ۱۹) یا بالاتر، برنامه‌تان برای دسترسی به دایرکتوری‌های مختص برنامه در فضای ذخیره‌سازی خارجی نیازی به درخواست اجازه‌های مرتبط با فضای ذخیره‌سازی ندارد.

وقتی کاربر برنامه شما را حذف نصب می‌کند، فایل‌های ذخیره‌شده در فضای ذخیره‌سازی مختص برنامه برداشته می‌شوند و بنابراین نباید از این فضای ذخیره‌سازی برای ذخیره کردن مواردی استفاده کنید که کاربر انتظار دارد مستقل از برنامه شما باقی بمانند.

انصراف موقت از فضای ذخیره‌سازی محدودشده

قبل‌از اینکه برنامه‌تان کاملاً با فضای ذخیره‌سازی محدودشده سازگار شود، می‌توانید موقتاً هم در آزمایش‌هایتان و هم در برنامه تولید انصراف دهید.

انصراف دادن در آزمایش‌ها

در Android 10 (سطح میانای برنامه‌سازی کاربردی ۲۹) و بالاتر، آزمایش‌های برنامه‌تان به‌طور پیش‌فرض در جعبه امن ذخیره‌سازی اجرا می‌شود. این محیط امن از دسترسی برنامه شما به فایل‌های خارج از دایرکتوری مختص برنامه و دایرکتوری‌های هم‌رسانی‌شده عمومی جلوگیری می‌کند.

اگر آزمایشی فایل‌هایی را برای میزبان تولید کند (مانند نماگرفت‌ها، داده‌های اشکال‌زدایی، داده‌های پوشش، یا سنجه‌های عملکرد)، می‌توانید این فایل‌ها را در دایرکتوری‌های سراسری بنویسید. برای انجام این کار، پرچم زیر را به مهار مربوطه که am instrument را فراخوانی می‌کند اضافه کنید:

-e no-isolated-storage 1

این پرچم بر همه رفتارهای چارچوب تست ابزارشده تأثیر می‌گذارد و بر همه کدهای تست فراخوانده‌شده تأثیر می‌گذارد. بنابراین، وقتی از این پرچم استفاده می‌کنید، نمی‌توانید سازگاری برنامه‌تان را با فضای ذخیره‌سازی محدودشده اعتبارسنجی کنید. برای خروجی آزمایش، بهتر است به‌جای آن در فضای ذخیره‌سازی با محدوده برنامه که توسط پوسته قابل‌خواندن است بنویسید. سپس می‌توانید آن دایرکتوری با دامنه برنامه را بکشید. برای تعیین اینکه از کدام دایرکتوری اطلاعات دریافت شود، getExternalMediaDirs() را فراخوانی کنید.

انصراف دادن در برنامه تولید

اگر برنامه شما Android 10 (سطح میانای برنامه کاربردی ۲۹) یا پایین‌تر را هدف قرار می‌دهد، می‌توانید به‌طور موقت از فضای ذخیره‌سازی محدودشده در برنامه تولیدی‌تان انصراف دهید. اما اگر Android 10 را هدف قرار می‌دهید، باید مقدار requestLegacyExternalStorage را در فایل مانیفست برنامه‌تان روی true تنظیم کنید:

<manifest ... >
  <!-- This attribute is "false" by default on apps targeting
       Android 10. -->
  <application android:requestLegacyExternalStorage="true" ... >
    ...
  </application>
</manifest>

برای آزمایش نحوه رفتار برنامه‌ای که Android 10 یا نسخه‌های پایین‌تر را هدف قرار می‌دهد هنگام استفاده از فضای ذخیره‌سازی محدود، می‌توانید با تنظیم مقدار requestLegacyExternalStorage روی false، با این رفتار موافقت کنید. اگر در دستگاهی آزمایش می‌کنید که Android 11 را اجرا می‌کند، می‌توانید از پرچم‌های سازگاری برنامه نیز استفاده کنید تا رفتار برنامه‌تان را با یا بدون فضای ذخیره‌سازی محدود آزمایش کنید.

منابع بیشتر

برای اطلاعات بیشتر درباره فضای ذخیره‌سازی Android، مطالب زیر را مشاهده کنید:

پست‌های وبلاگ