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