واحد MediaProvider

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