ماژول MediaProvider فرادادههای فهرستبندیشده (صدا، ویدئو و تصاویر از کارتهای SD و دستگاههای USB) را بهینه میکند و این دادهها را از طریق APIهای عمومی MediaStore در دسترس برنامهها قرار میدهد. برای حفظ حریم خصوصی کاربر، ماژول MediaProvider مدل امنیتی ذخیرهسازی محدود معرفیشده در اندروید ۱۰ را اجرا میکند که شامل ویرایش فرادادههای حساس مکانی است. این ماژول قابل بهروزرسانی است و اندروید را قادر میسازد تا سریعتر به مسائل امنیتی پاسخ دهد (از دادههای حساس کاربر محافظت کند) و فرمتهای رسانهای جدید را سریعتر اضافه کند (هماهنگی را برای کاربران و توسعهدهندگان فراهم کند).
تغییرات در اندروید ۱۰
اندروید ۱۰ چندین پیشرفت مرتبط با شناسایی و استخراج دادهها از فایلهای رسانهای را ارائه کرد، به طور خاص:
تعیین نوع محتوای فایل با استفاده از قسمت اول نوع MIME فایل. به عنوان مثال، سیستم عامل میداند که هم
image/pngو همimage/x-newly-invented-formatتصویر هستند و بنابراین میتواند مجوزهای مربوطه را به طور دقیق برای کاربر نهایی توصیف کند.تعیین نوع MIME فقط با استفاده از پسوند فایل (و بدون استفاده از شنود محتوا برای جلوگیری از مشکلات امنیتی).
تعیین نوع MIME یک فایل دلخواه با استفاده از ترکیبی از نگاشتهای بالادستی لینوکس دبیان و اندروید .
بازگرداندن دادههای مرتبط از فایلهای
video/*وaudio/*(از طریقMediaMetadataRetriever) و فایلهایimage/*(از طریقExifInterface).
تغییرات در اندروید ۱۱
در اندروید ۱۱، ماژول MediaProvider بر اساس تغییرات ایجاد شده در اندروید ۱۰ ساخته شده و بهبودهای زیر را به همراه دارد:
بهبودهایی در نمایهسازی. ماژول MediaProvider اکنون با تطبیق فرادادههای موجود با APIهای عمومی MediaStore، فرادادهها را نمایهسازی میکند. تغییرات شامل موارد زیر است:
ستون جدید
is_favoriteو آرگومانQUERY_ARG_MATCH_FAVORITEبرای فعال کردن برنامههای گالری-مانند جهت فیلتر کردن سریع رسانهها بر اساس این ستون.نمایهسازی فرادادههای فضای رنگی.
ستون جدید
is_trashedو آرگومانQUERY_ARG_MATCH_TRASHEDبرای فعال کردن فیلتر کردن برنامههای گالری بر اساس این ستون.APIهای جدیدی که امکان تغییر دستهای چندین مورد را با یک پنجرهی محاورهای واحد برای کاربر فراهم میکنند، از جمله
createDeleteRequest()،createFavoriteRequest()،createTrashRequest()وcreateWriteRequest().ستونهای جدید
GENERATION_ADDEDوGENERATION_MODIFIEDبرای استفاده در تشخیص سریع و قابل اعتماد تغییراتی که از زمان یک نقطه همگامسازی قبلی رخ دادهاند.API عمومی جدید
GROUP BYبرای استفاده با ستونهای فراداده اضافی که در بالا ذکر نشدهاند.
بهبود
ExifInterfaceبرای استخراج فراداده از کانتینرهای PNG و WebP.بهبودهایی در
SystemUIبرای نوشتن فرادادهDateTimeOriginalدر تصاویر گرفته شده از صفحه نمایش.
علاوه بر این، اکنون میتوانید MediaProvider را با اضافه کردن فرمتهای رسانهای جدید، علامتگذاری دستگاههای ذخیرهسازی که باید ایندکس شوند و حتی جایگزینی پشته MTP سفارشی کنید. برای جزئیات بیشتر، به بخش سفارشیسازی مراجعه کنید.
مرز ماژول
اندروید ۱۱ تمام کدهای موجود در packages/providers/MediaProvider را به مکان جدیدی منتقل میکند، به استثنای منطق مربوط به MTP. علاوه بر این، frameworks/base/core/java/android/provider/MediaStore.java اکنون در داخل مرز ماژول در packages/providers/MediaProvider قرار دارد.
قالب بسته
ماژول MediaProvider با فرمت APK-in-APEX است.
وابستگیها
وابستگیهای MediaProvider به سفارشیسازیها مربوط میشوند (یعنی، اگر MediaProvider را سفارشی میکنید، باید مطمئن شوید که پیادهسازی شما وابستگی مرتبط با سفارشیسازی شما را برآورده میکند).
هنگام استفاده از فرمتهای فایل رسانهای سفارشی یا غیراستاندارد (برای مثال، فرمتی که توسط یک برنامه دوربین مخصوص فروشنده تولید میشود)، باید هر فرمت سفارشی را در
MimeUtilsو ماژول Media Extractor ثبت کنید تا امکان نمایهسازی توسط MediaProvider فراهم شود.برای اطمینان از اینکه MediaProvider مجموعهای سفارشی از دستگاههای ذخیرهسازی (مانند اسلاتهای کارت SD و پورتهای USB) مورد استفاده در پیادهسازی
StorageManagerServiceرا ایندکس میکند، پرچمVolumeInfo.MOUNT_FLAG_INDEXABLEتنظیم کنید.هنگام استفاده از پیادهسازی سفارشی MTP (غیر AOSP)، اطمینان حاصل کنید که پیادهسازی صرفاً به APIهای عمومی و سیستمی متکی باشد تا امکان تعامل پیادهسازی با MediaStore را فراهم کند.
سفارشیسازی
شما میتوانید فرمتهای رسانهای جدیدی اضافه کنید، روی اینکه کدام دستگاههای ذخیرهسازی ایندکس شوند تأثیر بگذارید، پشته MTP را جایگزین کنید و از ایجاد پوشههای پیشفرض جلوگیری کنید.
قالبهای رسانهای سفارشی. برای هر قالب رسانهای سفارشی جدید، باید نگاشتی از پسوند فایل منحصر به فرد به یک نوع MIME ارائه دهید. ما اکیداً شما را تشویق میکنیم که فرآیند ثبت نام IANA را دنبال کنید.
شما نمیتوانید یک افزونه یا نوع MIME که قبلاً در AOSP تعریف شده است را دوباره تعریف کنید.
برای فایلهای
video/*وaudio/*، MediaProvider همچنان ازMediaMetadataRetrieverکمک میگیرد. از Media Extractors اندروید ۱۰ برای بازگرداندن فراداده برای فرمتهای سفارشی استفاده کنید.برای فایلهای
image/*، MediaProvider به استانداردسازی فرادادههایExifادامه میدهد. میتوانیدandroid.media.ExifInterfaceرا برای استخراج و بازگرداندن فرادادههایExifبرای هر فرمت تصویر سفارشی، بسط دهید.
پرچم نمایهسازی دستگاههای ذخیرهسازی. MediaProvider تمام حجمهای برگردانده شده توسط
StorageManager.getStorageVolumes()را نمایهسازی میکند، که در آنStorageVolume.getMediaStoreVolumeName()برابر با غیر تهی است. میتوانید لیست حجمهای برگردانده شده را طوری تنظیم کنید که بر آنچه نمایهسازی میشود تأثیر بگذارد، اما توصیه میکنیم حجمهای گذرا (مانند درایوهای USB OTG) را شامل نکنید.جایگزینی پشته MTP. اندروید ۱۱ پشته MTP را کاملاً خارج از مرز ماژول قرار میدهد و تضمین میکند که در برابر APIهای عمومی کار کند.
فهرست استثنائات پیشفرض پوشه. MediaProvider پوشههای پیشفرض
Music/،Podcasts/،Ringtones/،Alarms/،Notifications/،Pictures/،Movies/،Download/،DCIM/،Documents/،Audiobooks/وRecordings/(دایرکتوریRecordings/در اندروید ۱۱ و پایینتر در دسترس نیست) را برای درایوهای ذخیرهسازی تازه نصب شده ایجاد میکند. در اندروید ۱۲ و بالاتر، تولیدکنندگان تجهیزات اصلی (OEMها) میتوانند یک فهرست استثنائات بدون حساسیت به حروف بزرگ و کوچک برای پوشههایی که MediaProvider باید هنگام ایجاد پیشفرض از آنها صرف نظر کند، ارائه دهند. این پوشهها، به عنوان مثال پوشهDownload/، ممکن است همچنان توسط منطق خارجی ایجاد شوند.
برای افزودن یک لیست استثنا، از پوشش منبع زمان اجرای config_foldersToSkipInDefaultCreation (RRO) استفاده کنید. در زیر مثالی از نحوهی مستثنی کردن پوشههای پیشفرض Notifications/ و Ringtones/ آمده است:
<string-array name="config_foldersToSkipInDefaultCreation" translatable="false">
<item>"Notifications"</item>
<item>"Ringtones"</item>
</string-array>
آزمایش
شما میتوانید با استفاده از تستهای زیر، عملکرد MediaProvider را تأیید کنید:
برای تأیید عملکرد APIهای عمومی MediaStore، از تستهای موجود در بسته
CtsProviderTestCasesاز مجموعه تست سازگاری اندروید (CTS) استفاده کنید.برای تأیید عملکرد داخلی MediaProvider، از تستها در
MediaProviderTestsاستفاده کنید.
برای اجرای هر دو مجموعه تست با هم، از دستور atest زیر استفاده کنید:
atest --test-mapping packages/providers/MediaProvider