ماژول MediaProvider

ماژول 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